题目
有n(1<=n<=1e5)个数,第i个数为ui(1<=ui<=1e5)
对于其前缀i个数,必须删去一个数,使得对于剩下的数中,每种数字出现的次数相同
最大化符合条件的i,输出这个i
思路来源
官方题解
题解
记cnt[x]为出现次数为x的有几种数字,num[v]为数v出现的次数
只有以下四种情况符合条件,
①前i个数为同一种数
②前i个数为i种数,即每种出现了1次
③前i个数,其余种出现次数相等,此外仅有一种只出现了一次
④前i个数,其余种出现次数相等,此外仅有一种比其余种多一次
代码
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define sci(n) scanf("%d",&(n));
using namespace std;
const int N=1e5+10;
int n,cnt[N],num[N],v;
int mx,ans;
bool ok;
int main()
{
sci(n);
rep(i,1,n)
{
sci(v);
cnt[num[v]]--;
num[v]++;
cnt[num[v]]++;
mx=max(mx,num[v]);
ok=0;
if(cnt[1]==i)ok=1;
if(mx==i)ok=1;
if(cnt[1]==1&&cnt[mx]*mx==i-1)ok=1;
if(cnt[mx]==1&&cnt[mx-1]*(mx-1)==i-mx)ok=1;
if(ok)ans=i;
}
printf("%d\n",ans);
return 0;
}