[NOIP模拟试题一][原创代码]1.足球比赛(football.pas)

原题(来自老师)

1. 足球比赛

(football.pas/c/cpp) 时限1秒

【问题描述】

在2009的中国城市足球比赛中,在2^N支队中,有一些队在开赛前宣布了退出比赛。比赛采取的是淘汰赛。比如有4支队伍参加,那么1队和2队比赛,3队和4队赛,然后1队和2队的胜者与3队和4队的胜者争夺冠军。但是由于某些队伍退出,那么如果某个原本存在的比赛只有一个支队,那么这一支队自动晋级,如果没有队伍出现,那么就跟本没有比赛。比如,1队和2队退出比赛,那么就只有3队和4队的比赛,然后其胜者在原本和1队和2队的胜者的决赛中自动晋级,成为冠军。

给出哪些队退出的比赛计算会有多少场比赛中队伍自动晋级。

【输入】

第一行有两个数N(1<=N<=10),M。接下来有M个数,表示哪些队退出了比赛。选手编号从1到2

【输出】

在第一行输出有多少场比赛中队伍自动晋级。

【输入输出样例1】

football.in football.out
2 2

3 4

1

【输入输出样例2】

football.in football.out
3 5

1 2 3 4 5

2

【输入输出样例3】

football.in football.out
2 1

2

1

Pascal代码(Pillars原创)

program pizyds_2017_5_23_1;
 var
  n,m,i,temp,t:longint;
  so:array[0..2000] of boolean;

  function find(t:longint):longint;
   var
    i,j,s:longint;
    begin
     s:=0;
     t:=t div 2;
     for i:=1 to t do
      begin
       if so[2*i-1]<>so[2*i] then
        begin
         so[i]:=true;
         inc(s);
        end
       else
        if so[2*i-1] and so[2*i] then so[i]:=true
        else
         so[i]:=false;
      end;
       if t=1 then find:=s
         else find:=find(t)+s;
    end;


  begin
  assign(input,'football.in');
  reset(input);
  assign(output,'football.out');
  rewrite(output);
  readln(n,m);
  fillchar(so,sizeof(so),true);
  for i:=1 to m do
   begin
    read(temp);
    so[temp]:=false;
   end;
    t:=1;
    for i:=1 to n do t:=t*2;
    writeln(find(t));
  close(input);
  close(output);
   end.

成绩

100% AC

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注