题目:一个糖果盒子里面装着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;
}
}