奇怪地只得了60分……
查看原帖
奇怪地只得了60分……
761137
Double_Light楼主2023/7/15 19:37

rt,思路有些离谱(不知道对不对),但估计是代码的问题或是有细节没有考虑到,有没有人帮我调代码/hack 啊……(代码里有注释)

思路是这样的,桶(命名为 tot 数组)记录每个数字出现的个数,排序,将 totntot_n 减到 totn−1tot_{n-1},用掉 1(totn−totn−1)1(tot_n-tot_{n-1}) 次操作再将 totntot_{n} 和 totn−1tot_{n-1} 减到 totn−2tot_{n-2},用掉 2(totn−1−totn−2)2(tot_{n-1}-tot_{n-2}) 次操作……以此类推,直到剩余的操作不够减为止。

剩下的操作平分给这些本该继续往下减的数,直到剩余的 k=0k=0,此时 tottot 数组的最大值(代码中记为 pdpd)就是至少要有多少个同样的数才能成为众数。

如果 pd≤kpd\le k,说明有无限的数都可以成为众数,否则枚举 tot1∼ntot_{1\sim n},若 pd≤k+totipd\le k+tot_i 就可以成为众数。

然后就 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;
}
2023/7/15 19:37
加载中...