oj-选举

题目描述

某地进行选举,一共要选出 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值