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.

猜你喜欢

转载自blog.csdn.net/Robertlyp/article/details/83246007