原题链接:点击打开链接
给出一个长度为n的歌单,每首歌由歌单对应的队伍演出,但是你只喜欢前m个(1,2....m)队伍,现在改变歌单使得你喜欢的演出最少的队伍尽量大,求需要修改几次,并输出方案。
题解:
容易看出每个乐队演出n/m首歌,故以此为最小值进行维护。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <iostream>
#define INF 0x3f3f3f3f
#define mst(a, b) memset(a, (b), sizeof(a))
#define MOD 100000007
#define ll long long
#define lson node<<1, l, mid
#define rson node<<1|1, mid+1, r
const int maxn = 50005;
using namespace std;
int n, m;
int a[2005],vis[2005],cnt[2005];
int ans2 = 0;
int main() {
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int ans1 = n / m ;
for(int i=1;i<=n;i++) {
if (a[i] > m) continue;
if (cnt[a[i]] >= ans1) continue;
cnt[a[i]]++;
vis[i]=1 ;
}
for(int i=1;i<=n;i++){
if (vis[i])continue;
int minm = 1e9, posi = 1e9;
for(int j=1;j<=m;j++)
if (cnt[j] < minm)
minm = cnt[j], posi = j;
if (minm == ans1) continue;
ans2++;
cnt[posi]++,a[i] = posi;
}
cout << ans1 << " " << ans2 << endl;
bool flag = 0;
for(int i=1;i<=n;i++){
if (flag) {
cout << " ";
}
flag = 1;
cout << a[i];
}
cout << endl;
}