Codeforces Round #604 (Div. 2) C - Beautiful Regional Contest(贪心)

在这里插入图片描述
在这里插入图片描述
题意:给出n个选手的成绩,要给他们按成绩高低颁发金银铜牌,所有奖牌数不得多于参赛者人数的一半,同时金银铜牌都必须颁发,金牌数要小于银牌数和铜牌数,现在要尽可能把奖牌发完,问最佳的金银铜牌颁发方案。
思路:很显然贪心,因为题并没有说银牌和铜牌的关系,那么我们就固定金牌数(比如只给最高分的人金牌,好惨。。。),然后给成绩靠后的人发尽可能多的银牌和铜牌。不过话说这题用1e6的num数组就超时。。。

#include <bits/stdc++.h>
using namespace std;
const int Maxn=1e6+10;
const int maxn=4e5+1;
typedef long long ll;
int T,n;
ll a[maxn],num[maxn],b[maxn];
inline long long read() {
    long long tmp=0, fh=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') fh=-1; c=getchar();}
    while (c>='0'&&c<='9') tmp=tmp*10+c-48, c=getchar();
    return tmp*fh;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		map<int,int>num;
		scanf("%d",&n);
		int tot=n>>1,size=0;
		for(int i=1;i<=n;++i) 
		{
			b[i]=read();
			num[b[i]]++;
		}
		if(n<10) {
			printf("0 0 0\n");
			continue;
		}
		b[0]=Maxn;
		for(int i=1;i<=n;++i)
		{
			if(b[i]!=b[i-1]) a[++size]=b[i];
		}
		ll g=num[a[1]],s=0,t=0;
		int k=2;
		while(s<=g&&k<=size)
		{
			s+=num[a[k]];
			k++;
		}
		while(g+s+t<=tot&&k<=size)
		{
			t+=num[a[k]];
			k++;
		}
		k--;
		t-=num[a[k]];
		if(g+s+t>tot||g>=s||g>=t){
			printf("0 0 0\n");
			continue;
		}
		printf("%lld %lld %lld\n",g,s,t);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值