Codeforces Round #375 (Div. 2) C. Polycarp at the Radio
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
显然最优解为1~m平分n,因此给1~m分配n/m个曲子。
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 2010; int a[maxn]; int main() { int n, m; while(~scanf("%d %d", &n, &m)) { map<int, int> mp; map<int, int> need; int cnt = n / m; int yu = n % m; int cnt2 = 0; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); mp[a[i]]++; if(a[i] <= m) cnt2++; } for(int i = 1; i <= m; i++) { need[i] = cnt - mp[i]; } int ans = 0; for(int i = 1; i <= n; i++) { //printf("debug %d %d\n", a[i], need[a[i]]); if(a[i] > m) { for(auto it = need.begin(); it != need.end(); it++) { //printf("check %d %d\n", it -> first, it -> second); if(it -> second > 0) { it -> second = it -> second - 1; a[i] = it -> first; ans++; break; } } } else if(need[a[i]] <= -1) { for(auto it = need.begin(); it != need.end(); it++) { //printf("check %d %d\n", it -> first, it -> second); if(it -> second > 0) { it -> second = it -> second - 1; need[a[i]]++; a[i] = it -> first; ans++; break; } } } } printf("%d %d\n", cnt, ans); for(int i = 1; i <= n; i++) { printf("%d ", a[i]); }puts(""); } }