投票

第一題 投票

提交文件:vote.pas/c/cpp

輸入文件:vote.in

輸出文件:vote.out

問題描述

有n個候選人要競選主席,有m個人要投票。每個人只能投一票,如果某個人投了超過一票或者不投票,那麼這個人的投票將視爲非法。

給出m個人的投票情況,你的任務是統計投票情況,然後按照獲得投票數從高到低將候選人排序,如果獲得的投票數相同,則按照候選人的輸入順序從小到大排序。

 

輸入格式

第一行一個整數n,m(2<=n<=10,1<=m<=1000),分別表示候選人的數量和投票人的數量。

接下來n行,每行有一個字符串,表示候選人的名字,保證字符串長度不超過100,且不包含"Invalid"這個名字。

接下來m行,每行一個長度爲n的字符串,表示一個人的投票情況,字符串僅包含“X”和”.”。若字符串的第i個位置爲”X”,則表示這個人給第i個候選人投一票。

 

輸出格式

一共n+1行,前n行每行的信息分別爲候選人的名字以及它所獲的票佔總票數的百分比,名字和百分比用一個空格隔開。其中百分比要四捨五入保留兩位小數。

最後一行輸出非法票數佔總票數的比例,非法票數的名字用"Invalid"表示,具體看請看樣例輸出。

 

輸入樣例:

輸出樣例:

4 7

Loudy

Apples

Dogman

Miller

.X..

X...

....

..X.

..XX

..X.

..X.

Dogman 42.86%

Loudy 14.29%

Apples 14.29%

Miller 0.00%

Invalid 28.57%

 

 

數據範圍

100%的數據,n<=10,m<=1000

 

分析:

暴力模擬雙單位字排序。注意四捨五入、、


代碼:

const
  maxn=10;


var
  a,sum:array [0..maxn+1] of longint;
  name:array [0..maxn] of string;
  n,m:longint;


function check(s:string):boolean;
begin
  delete(s,pos('X',s),1);
  if pos('X',s)>0 then
    exit(true);
  exit(false);
end;


procedure sort;
var
  i,j,k:longint;
begin
  for i:=1 to n do
    for j:=i+1 to n do
      if sum[i]<sum[j] then
        begin
          k:=a[i];
          a[i]:=a[j];
          a[j]:=k;
          k:=sum[i];
          sum[i]:=sum[j];
          sum[j]:=k;
        end
      else
        if (sum[i]=sum[j]) and (a[i]>a[j]) then
          begin
            k:=a[i];
            a[i]:=a[j];
            a[j]:=k;
            k:=sum[i];
            sum[i]:=sum[j];
            sum[j]:=k;
          end;
end;


procedure init;
var
  i:longint;
  s:string;
  r:real;


begin
  readln(n,m);
  for i:=1 to n do
    begin
      readln(name[i]);
      a[i]:=i;
    end;
  for i:=1 to m do
    begin
      readln(s);
      if pos('X',s)=0 then
        begin
          inc(sum[n+1]);
          continue;
        end;
      if check(s) then
        begin
          inc(sum[n+1]);
          continue;
        end;
      inc(sum[pos('X',s)]);
    end;
  sort;
  for i:=1 to n do
    begin
      r:=sum[i]/m;
      if r*10000-trunc(r*10000)>=0.5 then
        r:=trunc(r*10000+1)
      else
        r:=trunc(r*10000);
      writeln(name[a[i]],' ',r/100:0:2,'%');
    end;
  r:=sum[n+1]/m;
  if r*10000-trunc(r*10000)>=0.5 then
    r:=trunc(r*10000+1)
   else
     r:=trunc(r*10000);
  writeln('Invalid ',r/100:0:2,'%');
end;


begin
  assign(input,'vote.in');reset(input);
  assign(output,'vote.out');rewrite(output);
  init;
  close(input);close(output);
end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章