第一題 投票
提交文件: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.