rt,思路有些离谱(不知道对不对),但估计是代码的问题或是有细节没有考虑到,有没有人帮我调代码/hack 啊……(代码里有注释)
思路是这样的,桶(命名为 tot 数组)记录每个数字出现的个数,排序,将 totn 减到 totn−1,用掉 1(totn−totn−1) 次操作再将 totn 和 totn−1 减到 totn−2,用掉 2(totn−1−totn−2) 次操作……以此类推,直到剩余的操作不够减为止。
剩下的操作平分给这些本该继续往下减的数,直到剩余的 k=0,此时 tot 数组的最大值(代码中记为 pd)就是至少要有多少个同样的数才能成为众数。
如果 pd≤k,说明有无限的数都可以成为众数,否则枚举 tot1∼n,若 pd≤k+toti 就可以成为众数。
然后就 WA 了七个点,Subtask #2 和 #5 有问题。
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int n,k,a[1000005],pd,cnt,k1,f,ans,tot[1000005];
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
tot[a[i]]++;//tot数组桶排序
}
k1=k;
sort(tot+1,tot+n+1);//按照每个数的数量排序
pd=tot[n];//pd是一个数需要多少个才能是众数
for(int i=n;i>=1;i--){
if((n-i+1)*(tot[i]-tot[i-1])<=k){//可以将tot[n]~tot[i]降到tot[i-1]
pd=tot[i-1];
cnt+=(n-i+1)*(tot[i]-tot[i-1]);
k-=cnt;
}
else{
f=i-1;
break;
}
}
pd-=k/(n-f+1);//最大化利用k次操作
if(pd<=k1){
cout<<"pigstd";
return 0;
}
for(int i=1;i<=n;i++){
if(pd<=k1+tot[i])ans++;
}
cout<<ans;
return 0;
}