2018年宁波市赛模拟题解
http://oj.nbdp.net/contest.php?cid=1321
Rank
T1
暴力枚举拳王,对当前拳手i,看能连续打败几人[i+1…n][1…i-1]
若 打败人数>=k 输出
另外 由于 k<=10^12 所以当打败人数=n-1 也就是a[i]最大时
也输出
这么水的题我竟WA 对了80%
var
a:array[1..1000]of longint;
n,i,j,tot:longint;k:int64;
begin
readln(n,k);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
begin
tot:=0;
j:=i+1;
while j<>i do
begin
if a[j]<a[i] then inc(tot)
else break;
inc(j);
if j>n then j:=1;
end;
if (tot=n-1)or(tot>=k)
then
begin
writeln(a[i]);
halt;
end;
end;
end.
T2
max{max{a[i].l}-min{b[i].r},max{b[i].l}-min{a[i].r}};
注意考虑负数
#include <bits/stdc++.h>
using namespace std;
struct Time
{
int l;int r;
}a[200010],b[200010];
bool cmp1(struct Time a,struct Time b)
{
return a.r<b.r;
}
bool cmp2(struct Time a,struct Time b)
{
return a.l>b.l;
}
int main()
{
int n,m;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r);
scanf("%d",&m);
for (int i=1;i<=m;i++)
scanf("%d%d",&b[i].l,&b[i].r);
sort(a+1,a+n+1,cmp2);
sort(b+1,b+m+1,cmp1);
int maxx(0);
maxx=max(maxx,a[1].l-b[1].r);
sort(a+1,a+n+1,cmp1);
sort(b+1,b+m+1,cmp2);
maxx=max(maxx,b[1].l-a[1].r);
printf("%d",maxx);puts("");
return 0;
}
T3
最基本的等差数列,枚举长度。
var
n,u,y:qword;
t,i:Longint;
begin
readln(n);u:=n*2;
t:=trunc(sqrt(n*2));
for i:=t downto 2 do
begin
if u mod i=0 then
begin
y:=u div i-i+1;
if y and 1=0 then
writeln(y shr 1,' ',y shr 1+i-1);
end;
end;
end.
T4
纯模拟(具体看题解)
const
dx:array[0..3]of -1..1=(1,0,-1,0);
dy:array[0..3]of -1..1=(0,-1,0,1);
var
a:array[1..60,1..60]of char;
b:array['0'..'3']of 0..3;
s:string;
n,m,i,j,k,l,tot,sx,sy,len:longint;
function is_ok:boolean;
var i,x,y:longint;
begin
x:=sx;y:=sy;
for i:=1 to len do
begin
x:=x+dx[b[s[i]]];y:=y+dy[b[s[i]]];
if (x<1)or(x>n)or(y<1)or(y>m) then exit(false);
if a[x,y]='#' then exit(false);
if a[x,y]='E' then exit(true);
end;
exit(false);
end;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(a[i,j]);
if a[i,j]='S' then
begin
sx:=i;sy:=j;
end;
end;
readln;
end;
readln(s);
tot:=0;len:=length(s);
for i:=0 to 3 do
begin
b['0']:=i;
for j:=0 to 3 do
if (i<>j) then
begin
b['1']:=j;
for k:=0 to 3 do
if (i<>k)and(j<>k) then
begin
b['2']:=k;
for l:=0 to 3 do
if (i<>l)and(j<>l)and(k<>l) then
begin
b['3']:=l;
if is_ok then
inc(tot);
end;
end;
end;
end;
writeln(tot);
end.