选举

一、原题

题目描述

某地进行选举,一共要选出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]);//输出答案
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值