#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 1e5 + 5;
int n,a[N],kin[N],can_f[N],pos,ans = 0;
bool apr[N];
int main(){
cin >> n;
for(int i = 1; i <= n ;i++) cin >> a[i];
sort(a + 1,a + 1 + n);
for(int i = 1; i <= n; i++){
if(!apr[a[i]]) kin[++pos] ++,can_f[pos]++,apr[a[i]] = 1;
else can_f[pos]++,kin[pos]++;
}
for(int i = 1, j = 2;i <= pos && j <= pos;){
if(kin[i] > kin[j]) can_f[j] = 0,kin[i] -= kin[j],j++;
else {
if(j - i == 1){
if(can_f[j] > kin[i])can_f[j] -= kin[i], kin[i] = 0,i++,j++;
else kin[i] -= can_f[j],can_f[j] = 0,i++,j++;
}
else{
if(can_f[j] > kin[i])can_f[j]-=kin[i], kin[i] = 0,i++;
else kin[i] -= can_f[j],can_f[j] = 0,i++;
}
}
}
for(int i = 1; i <= pos; i++){
ans += kin[i];
}
cout << ans << "\n";
return 0;
}
做法:就是用双指针进行模拟,算出有那些卡没掉后再把剩下的卡加起来。