版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiang_6/article/details/83549968
本场详细题解见:https://blog.csdn.net/xiang_6/article/details/83549528
题意&思路见上述链接
#include<bits/stdc++.h>
using namespace std;
#define out fflush(stdout)
#define fast ios::sync_with_stdio(0),cin.tie(0);
#define FI first
#define SE second
typedef long long ll;
typedef pair<int,int> P;
const int maxn = 2000 + 7;
const int INF = 0x3f3f3f3f;
int n, m;
int a[maxn];
map<int,int> mp;
queue<P> qu;
int main() {
scanf("%d%d", &n, &m);
int t_ = n / m;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
mp[a[i]]++;
}
for(int i = 1; i <= m; ++i) {
int t = mp[i];
if(t < t_) {
qu.push(P(i, t_-t));
}
}
int ans = 0;
while(!qu.empty()) {
P t = qu.front(); qu.pop();
bool ok = 0;
for(int i = 1; i <= n; ++i) {
if(a[i] > m) {
a[i] = t.FI;
if(t.SE > 1) {
qu.push(P(t.FI, t.SE-1));
}
ok = 1;
ans++;
break;
}
}
if(ok) continue;
for(int i = 1; i <= n; ++i) {
if(mp[a[i]] > t_) {
mp[a[i]]--;
a[i] = t.FI;
if(t.SE > 1) {
qu.push(P(t.FI, t.SE-1));
}
ans++;
break;
}
}
}
// for(int i = 1; i <= n; ++i) {
// if(a[i] > m) {
// a[i] = 1;
// ans++;
// }
// }
printf("%d %d\n", t_, ans);
for(int i = 1; i <= n; ++i) {
printf("%d%c", a[i], (i == n ? '\n' : ' '));
}
return 0;
}