描述:
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.
题意:
看题的时候前面说了很多差点被绕晕了,坑惨了_(:зゝ∠)_,其实就是1~m中最少的数尽量达到n/m个
思路:
暴力扫一下
代码一:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 2020;
int n, m;
int a[N];
int b[N];
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if (a[i] <= m)
b[a[i]]++;
}
int k = n / m;
int it = 1;
int ans = 0;
for (int i = 0; i < n; i++)
{
if (a[i] <= m && b[a[i]] <= k) continue;
while(it <= m && b[it] >= k) it++;
if (it > m) break;
ans++;
if (a[i] <= m) b[a[i]]--;
a[i] = it;
b[it]++;
}
printf("%d %d\n", k, ans);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
代码二:
(窝的丑代码)
#include <bits/stdc++.h>
#define pr(x) cout << #x << "= " << x << " " ;
#define pl(x) cout << #x << "= " << x << endl;
#define ll __int64
using namespace std;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
vector<int>pos;//可能修改的位置
int cnt[2200];
int a[2200];
int main(){
int n,m;
read(n);read(m);
for(int i=1; i<=n; i++){
read(a[i]);
if(a[i]>=1 && a[i]<=m)cnt[a[i]]++;
}
int sum=0,ans=n/m;
for(int i=1; i<=n; i++){//大于m可能需要修改的位置
if(a[i]>m){
pos.push_back(i);
}
}
for(int i=1; i<=n; i++)if(a[i]<=m){//多于n/m可能需要修改的位置
if(cnt[a[i]]>n/m){
pos.push_back(i);
cnt[a[i]]--;
}
}
int flag=0;
for(int i=0; i<pos.size(); i++){
if(flag)break;
for(int j=1; j<=m; j++){
if(cnt[j]<n/m){
a[pos[i]]=j;
cnt[j]++;
sum++;
break;
}
if(j==m)flag=1;
}
}
printf("%d %d\n",ans,sum);
for(int i=1; i<=n; i++)printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}