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;	
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章