題目:一個糖果盒子裏面裝着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;
}
}