oj-选举

来源:互联网 发布:中国作家 知乎 编辑:程序博客网 时间:2024/04/30 03:13

题目描述

某地进行选举,一共要选出 14 位议员。有若干个党派,一张选票只能投给一个党派。现在有

 

X 张选票,已知每个党派获得的选票。有一些党派得到的票数太少,以至于可以忽略不计。现

 

在的选举规则是这样的:首先只考虑获得不少于所有选票数的 5%的党派,将这些党派得到的

 

选票数除以 1~14 的每个数,这样每个党派就将得到 14 个有理数。第一个议员来自于最大的那

 

个数代表的党派,第二个议员来自于第二大的数代表的党派,这样直到 14 个议员都产生。注意:

 

保证一定能够选出 14 个议员,也就是说没有两个有理数是相等的。

 

现在请输出那些产生议员的党派和产生的数量。

输入

第一行包含一个正整数 X(1<=X<=2500000),表示所有的选票。

 

接下来一个整数 N(0<=N<=10),表示我们考虑的党派数量。接下来 N 行,每行一个字符和一

 

个整数 G ,以空格隔开。字符代表党派名称,整数 G 代表该党派获得的选票数量,

 

0<=G<=250000。

 

注意,因为有些党派忽略不计,所以列出的党派获得选票数之和不一定等于选票的总数。

输出

有多少个党派获得不少于 5%的选票,输出就有多少行。

 

输出党派的编号和它产生的议员的数量,用空格隔开。

样例输入

235217
3
A 107382
C 18059
B 43265

样例输出

A 9
B 4
C 1

提示

输出满足题目要求的党派编号按字典顺序输出


这道题没别的难点,就是考细节~~

首先是要>=5%

然后按字典序输出~

这些全都不是问题!!

然后我就草率地提交了= =

#include<cstdio>#include<algorithm>using namespace std;int x,n,e=-13;char c[5];struct nde{double num;char gp;}a[300];struct as{int per;char gp;}ans[30];bool cmp1(nde p,nde q){if(p.num!=q.num) return p.num>q.num;return p.gp<q.gp;}bool cmp2(as p,as q){if(p.per!=q.per) return p.per>q.per;return p.gp<q.gp;}int main(){int i,j,k;scanf("%d%d",&x,&n);for(i=1;i<=n;i++){scanf("%s %d",c,&k);if((x+0.0)/(k+0.0)<=20){e+=14;a[e].gp=c[0];a[e].num=k+0.0;for(j=1;j<14;j++){a[e+j].gp=a[e].gp;a[e+j].num=a[e].num/(j+1.0);}}}sort(a+1,a+e+15,cmp1);for(i=1;i<=14;i++){ans[a[i].gp-'A'+1].per++;ans[a[i].gp-'A'+1].gp=a[i].gp;}//sort(ans+1,ans+28,cmp2);//for(i=1;ans[i].per;i++)for(i=1;i<=26;i++)if(ans[i].per)printf("%c %d\n",ans[i].gp,ans[i].per);}

于是很光荣地...W..A....了..........

经同学指点,我发现了代码中很致命的错....

题目要求,就算一个党派没人也要输出啊!!

然而我并没有...

后来经过一点小~改~动~终于 A   C      了      !!!

#include<cstdio>#include<algorithm>using namespace std;int x,n,e=-13;char c[5];struct nde{double num;char gp;}a[300];struct as{int per;char gp;}ans[30];bool cmp1(nde p,nde q){if(p.num!=q.num) return p.num>q.num;return p.gp<q.gp;}/*bool cmp2(as p,as q){if(p.per!=q.per) return p.per>q.per;return p.gp<q.gp;}*/int main(){int i,j,k;scanf("%d%d",&x,&n);for(i=1;i<=n;i++){scanf("%s %d",c,&k);if((x+0.0)/(k+0.0)<=20+0.000005){e+=14;a[e].gp=c[0];a[e].num=k+0.0;for(j=1;j<14;j++){a[e+j].gp=a[e].gp;a[e+j].num=a[e].num/(j+1.0);}ans[a[e].gp-'A'+1].per=-1;ans[a[e].gp-'A'+1].gp=a[e].gp;}}sort(a+1,a+e+15,cmp1);for(i=1;i<=14;i++){if(ans[a[i].gp-'A'+1].per==-1) ans[a[i].gp-'A'+1].per=0;ans[a[i].gp-'A'+1].per++;ans[a[i].gp-'A'+1].gp=a[i].gp;}//sort(ans+1,ans+28,cmp2);//for(i=1;ans[i].per;i++)for(i=1;i<=26;i++)if(ans[i].per){if(ans[i].per==-1) ans[i].per=0;printf("%c %d\n",ans[i].gp,ans[i].per);}}

啊简直了复赛迫在眉睫居然犯这种不审题的错误..

没事总比freopen忘记写或忘删注释或者文件名打错好.....

啊啊啊啊啊good luck to me!!

然后继续复习~

代码中-1是为了标记这个党派至少被考虑过~

到时候再把-1单独考虑~~

别问我注释的是什么,只是当初搞错了输出顺序....

0 0
原创粉丝点击