Polycarp is a music editor at the radio station. He received a playlist for tomorrow, that can be represented as a sequence a1, a2, ..., an, where ai is a band, which performs the i-th song. Polycarp likes bands with the numbers from 1 to m, but he doesn't really like others.
We define as bj the number of songs the group j is going to perform tomorrow. Polycarp wants to change the playlist in such a way that the minimum among the numbers b1, b2, ..., bm will be as large as possible.
Find this maximum possible value of the minimum among the bj (1 ≤ j ≤ m), and the minimum number of changes in the playlist Polycarp needs to make to achieve it. One change in the playlist is a replacement of the performer of the i-th song with any other group.
The first line of the input contains two integers n and m (1 ≤ m ≤ n ≤ 2000).
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109), where ai is the performer of the i-th song.
In the first line print two integers: the maximum possible value of the minimum among the bj (1 ≤ j ≤ m), where bj is the number of songs in the changed playlist performed by the j-th band, and the minimum number of changes in the playlist Polycarp needs to make.
In the second line print the changed playlist.
If there are multiple answers, print any of them.
4 2 1 2 3 2
2 1 1 2 1 2
7 3 1 3 2 2 2 2 1
2 1 1 3 3 2 2 2 1
4 4 1000000000 100 7 1000000000
1 4 1 2 3 4
In the first sample, after Polycarp's changes the first band performs two songs (b1 = 2), and the second band also performs two songs (b2 = 2). Thus, the minimum of these values equals to 2. It is impossible to achieve a higher minimum value by any changes in the playlist.
In the second sample, after Polycarp's changes the first band performs two songs (b1 = 2), the second band performs three songs (b2 = 3), and the third band also performs two songs (b3 = 2). Thus, the best minimum value is 2.
贪心题,最大值为 n/m,然后最少的操作数是将所有次数小于n/m的数的次数变为n/m所需花的操作次数之和。然后需要改动的数有两种可能,一种是数值大于m,另一种是数值小于等于吗,但出现次数大于n/m。
#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
double PI=acos(-1);
int n,m,x;
int a[2005],b[2005];
int check(int x)
{
if(b[x]>=n/m){
while(b[x]>=n/m){
x++;
}
}
return x;
}
int main()
{
scanf("%d%d",&n,&m);
memset(b,0,sizeof(b));
int ans=n/m;
for(int i=0;i<n;i++){
scanf("%d",a+i);
if(a[i]<=m){
b[a[i]]++;
}
}
int cnt=0;
for(int i=1;i<=m;i++){
if(b[i]<ans){
cnt+=ans-b[i];
}
}
x=check(1);
printf("%d %d\n",ans,cnt);
for(int i=0;i<n&&cnt;i++){
if(a[i]>m||a[i]<=m&&b[a[i]]>ans){
if(a[i]<=m&&b[a[i]]>ans){
b[a[i]]--;
}
a[i]=x;
b[x]++;
x=check(x);
cnt--;
}
}
for(int i=0;i<n;i++){
printf(i==n-1?"%d\n":"%d ",a[i]);
}
return 0;
}