Candy Box (easy version) CodeForces - 1183D(贪心)

题目:一个糖果盒子里面装着n个糖果。 Dirt030准备给预备队的新生们准备一个礼物。 现在他开始编号了:第1颗糖果是a[1]类型,第2颗糖果是a[2]类型,……第i颗糖果是a[i]类型。 作为一个天秤座的宅男他对自己的礼物有严格的要求:每种糖果的数量必须不一样。 但是Dirt030又想把尽可能多的糖果送给大家。问:Dirt030最多能送给大家多少个糖果。(也就是说尽管他准备了很多的糖果,但不一定全部都送给大家。) Note:本题所有的数都在0~200000以内。

题解:贪心,肯定先拿数量最大的糖果种类,然后在拿第二大的,如果跟第一大的相同,那就少拿一个,以此类推。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector> 
#include <algorithm>
using namespace std;
const int maxn=2e5+5;
int num[maxn],a[maxn];
int main() {
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--) {
		int n,x;
		cin>>n;
		vector<int>cnt(n+1);
		for(int i=1; i<=n; i++) {
			cin>>x;
			cnt[x]++;
		}
		sort(cnt.rbegin(),cnt.rend());
		int ans=cnt[0],lst=cnt[0];
		for(int i=1;i<cnt.size();i++){
			if(lst==0)break;
			if(cnt[i]>=lst){
				ans+=lst-1;
				lst--;
			}
			else{
				ans+=cnt[i];
				lst=cnt[i];
			}
		}
		cout<<ans<<endl;	
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值