【中山市選2014】投票
阿新 • • 發佈:2019-01-29
Description
有n個候選人要競選主席,有m個人要投票。每個人只能投一票,如果某個人投了超過一票或者不投票,那麼這個人的投票將視為非法。
給出m個人的投票情況,你的任務是統計投票情況,然後按照獲得投票數從高到低將候選人排序,如果獲得的投票數相同,則按照候選人的輸入順序從小到大排序。
Input
第一行一個整數n,m(2<=n<=10, 1<=m<=1000),分別表示候選人的數量和投票人的數量。
接下來n行,每行有一個字串,表示候選人的名字,保證字串長度不超過100,且不包含”Invalid”這個名字。
接下來m行,每行一個長度為n的字串,表示一個人的投票情況,字串僅包含“X”和”.”。若字串的第i個位置為”X”,則表示這個人給第i個候選人投一票。
Output
一共n+1行,前n行每行的資訊分別為候選人的名字以及它所獲的票佔總票數的百分比,名字和百分比用一個空格隔開。其中百分比要四捨五入保留兩位小數。
最後一行輸出非法票數佔總票數的比例,非法票數的名字用”Invalid”表示,具體看請看樣例輸出。
Sample Input
4 7
Loudy
Apples
Dogman
Miller
.X..
X…
….
..X.
..XX
..X.
..X.
Sample Output
Dogman 42.86%
Loudy 14.29%
Apples 14.29%
Miller 0.00%
Invalid 28.57%
Data Constraint
100%的資料,n<=10,m<=1000
思路:
簡單的字串處理
十分建議用pascal
程式碼:
type arr=record
na:string;
da,x:longint;
end;
var a:array[0..111] of arr;
s:string;
n,m,i,j,k,t:longint;
begin
readln(n,m);
for i:=1 to n do
begin
readln(a[i].na);
a[i].x:=i;
end;
a[n+1 ].na:='Invalid';
for i:=1 to m do
begin
readln(s);
t:=n+2;
for j:=1 to length(s) do
if (s[j]='X') then
if (t=n+2) then t:=j else t:=n+1;
if (t=n+2) then t:=n+1;
inc(a[t].da);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if (a[i].da<a[j].da) or ((a[i].da=a[j].da) and (a[i].x>a[j].x)) then
begin
a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];
end;
for i:=1 to n+1 do
writeln(a[i].na,' ',trunc(a[i].da*10000/m+0.5)/100:0:2,'%');
end.