一、原题
题目描述
某地进行选举,一共要选出14 位议员。有若干个党派,一张选票只能投给一个党派。现在有X张选票,已知每个党派获得的选票。有一些党派得到的票数太少,以至于可以忽略不计。现在的选举规则是这样的:首先只考虑获得不少于所有选票数的5%的党派,将这些党派得到的选票数除以1~14 的每个数,这样每个党派就将得到14 个有理数。第一个议员来自于最大的那个数代表的党派,第二个议员来自于第二大的数代表的党派,这样直到14 个议员都产生。注意:保证一定能够选出14 个议员,也就是说没有两个有理数是相等的。现在请输出那些产生议员的党派和产生的数量。
输入格式
第一行包含一个正整数X(1<=X<=2500000),表示所有的选票。
接下来一个整数N(0<=N<=10),表示我们考虑的党派数量。接下来N 行,每行一个字符和一个整数G , 以空格隔开。字符代表党派名称, 整数G 代表该党派获得的选票数量,0<=G<=250000。
注意,因为有些党派忽略不计,所以列出的党派获得选票数之和不一定等于选票的总数。
输出格式
有多少个党派获得不少于5%的选票,输出就有多少行。
输出党派的编号和它产生的议员的数量,用空格隔开。
二、分析
这道题表面看上去是一道水题,可是那个5%非常的坑爹,必须要用一个bool数组处理一下为零的情况。所以呢,我就错了一个点,这是我的错误代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,ans[150],x;
struct node{
int a; //a代表选票数
char c;
}p[15],tmp[150];
bool cmp(node x,node y){return x.a>y.a;}
int main()
{
//freopen("election.in","r",stdin);
//freopen("election.out","w",stdout);
cin>>x>>n;
for(int i=1;i<=n;){
char c;
int g;
cin>>c>>g;
if(g>=x*0.05){
p[i].a=g;
p[i].c=c;
i++;
}
else
n--;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=14;j++){
tmp[(i-1)*14+j].c=p[i].c;
tmp[(i-1)*14+j].a=p[i].a/j;
}
}
sort(tmp+1,tmp+1+14*n,cmp);
for(int i=1;i<=14;i++)
ans[tmp[i].c-0]++;
for(int i=1;i<=128;i++)
if(ans[i])//此处坑爹!为零也要输出!
printf("%c %d\n",i,ans[i]);
}
于是,这个点我就愉快地错了:
election.in
237667
7
A 134211
B 28403
L 12010
K 5738
G 10260
Z 4175
C 13375
election.out
A 11
B 2
C 1
L 0
所以说,我就处理了:一个bool数组。
我的代码可能有些臃肿,只是考试时乱写的,敬请谅解!
三、源代码
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,ans[150],x;
bool q[150];//bool数组
struct node{
int a; //a代表选票数
char c;
}p[15],tmp[150];
bool cmp(node x,node y){return x.a>y.a;}
int main()
{
//freopen("election.in","r",stdin);
//freopen("election.out","w",stdout);
cin>>x>>n;
for(int i=1;i<=n;){
char c;
int g;
cin>>c>>g;
if(g>=x*0.05){
q[c-0]=1;//于是乎,我增加了一个bool数组
p[i].a=g;
p[i].c=c;
i++;
}
else
n--;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=14;j++){//把所有数除以1-14(要保存是哪一个对的,方便统计)
tmp[(i-1)*14+j].c=p[i].c;//保存序列数,以便统计
tmp[(i-1)*14+j].a=p[i].a/j;
}
}
sort(tmp+1,tmp+1+14*n,cmp);
for(int i=1;i<=14;i++)//前14
ans[tmp[i].c-0]++;
for(int i=1;i<=128;i++)
if(q[i])//直接判断bool数组
printf("%c %d\n",i,ans[i]);//输出答案
}