题意:给定 n 个数,让把某一些变成 1-m之间的数,要改变最少,使得1-m中每个数中出现次数最少的尽量大。
虽然这个贪心挺好想到的,但是却不是那么容易敲出来。。。
看别人的代码,真好。。
int a[N];
int cnt[N];
int main(){
int n,m;
sf("%d%d",&n,&m);
int ans1=n/m,ans2=0;
rep(i,1,n){
sf("%d",&a[i]);
if(a[i]<=m){
cnt[a[i]]++;
}
}
for(int i=1;i<=n;++i){
if(a[i]>m||a[i]<=m&&cnt[a[i]]>ans1){
for(int j=1;j<=m;++j){
if(cnt[j]<ans1){
if(a[i]<=m){
cnt[a[i]]--;
}
a[i]=j;
cnt[j]++;
ans2++;break;
}
}
}
}
pf("%d %d\n",ans1,ans2);
rep(i,1,n){
pf("%d%c",a[i],i==n?'\n':' ');
}
}
本文探讨了一种涉及贪心策略的算法问题,旨在通过最小化操作将一组数值转换为特定范围内的数,并确保各数值分布均匀。文章通过具体代码示例展示了如何实现这一过程。
429

被折叠的 条评论
为什么被折叠?



