题目:
使前M个元素出现次数的最小值最大。
题解:
最终结果肯定是n/m。
如果不够就把多余的给小的。
如果还不够就把大的给小的。
上课时刷的题,没认真想,代码瞎写的……
#include<iostream>
using namespace std;
int n,m;
int arr[101000];
int band[101000];
int main(){
cin>>n>>m;
int lef=0;
for(int i=1;i<=n;i++){
cin>>arr[i];
if(arr[i]>m) lef++;
else band[arr[i]]++;
}
int cnt=0;
for(int i=1;i<=n;i++){
if(arr[i]<=m) continue;
int minn=1e9+1;
int bitmin=0;
for(int j=1;j<=m;j++){
if(minn>band[j]){
minn=band[j];
bitmin=j;
}
}
if(minn<n/m){
cnt++;
band[bitmin]++;
arr[i]=bitmin;
}
}
int avg=0;
for(int i=1;i<=m;i++){
avg+=band[i];
}
avg/=m;
while(true){
int minn=1e9+1;
int bitmin=0;
for(int i=1;i<=m;i++){
if(band[i]<minn){
minn=band[i];
bitmin=i;
}
}
int maxx=0;
int bitmax=0;
for(int i=1;i<=m;i++){
if(band[i]>maxx){
maxx=band[i];
bitmax=i;
}
}
if(minn<avg){
cnt++;
band[bitmin]++;
band[bitmax]--;
for(int i=1;i<=n;i++){
if(arr[i]==bitmax){
arr[i]=bitmin;
break;
}
}
}
else break;
}
int maxxx=1e9+1;
for(int i=1;i<=m;i++){
maxxx=min(maxxx,band[i]);
}
cout<<maxxx<<' '<<cnt<<endl;
for(int i=1;i<=n;i++){
cout<<arr[i];
if(i==n) cout<<endl;
else cout<<' ';
}
}