SSL P2515 2014年中山市选拔赛 投票

题目大意:
在N个人里面选候选人,给出M份投票,从大到小输出每个的投票,然后输出不合法的票的数量。

题解:
1.读入时把票投的人的数量记录,即有多少个X,再记住选的第L个人。如果此票投了多个人亦或者未投就给不合法票数+1,不然给给第L个人+1。
2.对票数排序,记得判断票数相同时先后顺序。
3.按顺序输出每个人占的百分比(票数/总票数),因为pascal是四舍六入,要+0.5计算。
时间复杂度:O(N^2)

var
      a:array [0..12] of string;
      b:array [0..11] of real;
      c:array [0..10] of longint;
      s:char;
      n,i,j,k,l,m:longint;
begin
      readln(n,m);
      a[n+1]:='Invalid';
      for i:=1 to n do
          begin
             readln(a[i]);
             c[i]:=i;
          end;
      for i:=1 to m do
          begin
               l:=0; k:=0;
               for j:=1 to n do
                   begin
                        read(s);
                        if s='X'
                           then begin
                                    inc(k);
                                    l:=j;
                                end;
                   end;
               readln;
               if  k=1 then b[l]:=b[l]+1
                       else b[n+1]:=b[n+1]+1;
          end;
      for i:=1 to n-1 do
          for j:=i+1 to n do
              if (b[i]or ((b[i]=b[j]) and (c[i]>c[j]))
                 then begin
                           a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
                           b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
                           c[0]:=c[i];c[i]:=c[j];c[j]:=c[0];
                      end;
      for i:=1 to n+1 do
          writeln(a[i],' ',trunc((b[i]/m)*10000+0.5)/100:0:2,'%');
end.

你可能感兴趣的:(暴力/枚举/模拟,排序&拓扑,pascal)