选举

来源:互联网 发布:芙蓉云计算数据中心 编辑:程序博客网 时间:2024/06/10 00:15

一、原题

题目描述

某地进行选举,一共要选出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]);//输出答案}
0 0
原创粉丝点击