题目描述
某地进行选举,一共要选出 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单独考虑~~
别问我注释的是什么,只是当初搞错了输出顺序....