选举

题目描述:在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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值