85分玄关求调
查看原帖
85分玄关求调
757865
dengqingrui123楼主2024/10/28 22:12
#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;
	
}

做法:就是用双指针进行模拟,算出有那些卡没掉后再把剩下的卡加起来。

2024/10/28 22:12
加载中...