题目描述:在12月份开始的时候,选举也开始了。每个选举区将有14个代表选出,每个选民是投票给几个政党中的某一个的,投票结束以后,用一种特殊的办法来产生代表。 首先,我们要找出所有至少获得5%选票的政党。每个政党的选票数量将被依次除以1到14,我们把得到的结果叫做每个政党的分数。 第一个代表将从得分最高的政党中产生,第二个政党将从得分第二的政党中产生,依次类推,直到所有的14名代表都产生。(说明:这里所有的分数都会是唯一的)。 写一个程序,我们给出总共的投票数量和每个政党的得票数量,最终决定每个政党中的代表人数,一些可以忽略不计的投票将不被列出,所以有可能列出的每个政党的得票数量总和小于总投票数。
输入:第一行包含一个正整数X(1<=X<=2500000),表示总共的投票数量。第二行表示一个正整数N(0<=N<=10),表示我们将要考虑的政党数量。接下来N行,每行是一个政党标识符(一个大写字母)和这个政党的得票数量。
输出:输出符合条件的政党的代表的数量。对于每个政党,输出一个政党的标识符和代表的数量。输出应该按照政党的字典序从小到大输出。
这题在比赛时没AC,也是题目描述的锅(看不懂啊!!!)。
思路:直接暴力,但要注意(如果一个政党的得票数大于5%,即使这个政党没有代表,也要输出0)。
代码:
var
x,n,i,j,t:longint;
r:array[0..10]of extended;
ans:array[65..90]of longint;
a:array[65..90,1..14]of extended;
o:array[0..10000]of extended;
o1:array[0..10000]of longint;
s,s1:string;
c:char;
begin
assign(input,'dhondt.in');
reset(input);
assign(output,'dhondt.out');
rewrite(output);
readln(x);
readln(n);
r[0]:=x*0.05;
for i:=1 to n do
begin
readln(s);
c:=s[1];
t:=ord(c);
s1:='';
for j:=3 to length(s) do s1:=s1+s[j];
val(s1,a[t,1]);
for j:=2 to 14 do a[t,j]:=a[t,1]/j;
end;
t:=0;
for i:=65 to 90 do
for j:=1 to 14 do
begin
inc(t);
o1[t]:=i;
o[t]:=a[i,j];
end;
for i:=1 to t do
for j:=i+1 to t do
if o[i]<o[j] then
begin
o1[0]:=o1[i];
o1[i]:=o1[j];
o1[j]:=o1[0];
o[0]:=o[i];
o[i]:=o[j];
o[j]:=o[0];
end;
for i:=1 to 14 do
inc(ans[o1[i]]);
for i:=65 to 90 do
if (ans[i]>0)or(a[i,1]>r[0]) then
writeln(chr(i),' ',ans[i]);
end.