Codeforces723 C. Polycarp at the Radio (模拟)
来源:互联网 发布:生物统计 知乎 编辑:程序博客网 时间:2024/05/18 20:05
题目连接:http://codeforces.com/contest/723/problem/C
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 21 2 3 2
2 11 2 1 2
7 31 3 2 2 2 2 1
2 11 3 3 2 2 2 1
4 41000000000 100 7 1000000000
1 41 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个数,要求将值为1到m中出现最小次数的数变成尽可能得多。
解题思路:题目意思有点感人……反正就是说1到m的数要至少出现n/m次,所以就把大于m的数压进一个队列里,然后把1到m中的出现次数大于n/m次的压进另一个队列中,然后就xjb搞吧……
/* ***********************************************┆ ┏┓ ┏┓ ┆┆┏┛┻━━━┛┻┓ ┆┆┃ ┃ ┆┆┃ ━ ┃ ┆┆┃ ┳┛ ┗┳ ┃ ┆┆┃ ┃ ┆┆┃ ┻ ┃ ┆┆┗━┓ 马 ┏━┛ ┆┆ ┃ 勒 ┃ ┆ ┆ ┃ 戈 ┗━━━┓ ┆┆ ┃ 壁 ┣┓┆┆ ┃ 的草泥马 ┏┛┆┆ ┗┓┓┏━┳┓┏┛ ┆┆ ┃┫┫ ┃┫┫ ┆┆ ┗┻┛ ┗┻┛ ┆************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <bitset>using namespace std;#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)#define pb push_back#define mp make_pairconst int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define LL long long#define ULL unsigned long long#define MS0(X) memset((X), 0, sizeof((X)))#define SelfType intSelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}#define Sd(X) int (X); scanf("%d", &X)#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())#define all(a) a.begin(), a.end()#define mem(x,v) memset(x,v,sizeof(x))typedef pair<int, int> pii;typedef pair<long long, long long> pll;typedef vector<int> vi;typedef vector<long long> vll;inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}//#pragma comment(linker, "/STACK:102400000,102400000")int a[2500];int t[2500];queue<int> q;queue<int> p;queue<int> res;int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);ios::sync_with_stdio(0);cin.tie(0);int n,m;n = read(), m = read();int cnt = n / m;MS0(t);for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]>m)q.push(i); else { t[a[i]]++; if(t[a[i]]>cnt) p.push(i); }}int sum = 0; for(int i=1;i<=m;i++) { if(t[i]<cnt) { int tot = cnt -t[i]; while(tot--)res.push(i); } }while(!q.empty() && !res.empty()) { int pos = q.front(); q.pop(); int val = res.front(); res.pop(); a[pos] = val; sum++; }while(!res.empty() && !p.empty()) { int pos = p.front(); p.pop(); int val = res.front(); res.pop(); a[pos] = val; sum++; } printf("%d %d\n",cnt,sum); for(int i=1;i<=n;i++) { printf("%d",a[i]); if(i==n)printf("\n"); else printf(" "); }return 0;}
- Codeforces723 C. Polycarp at the Radio (模拟)
- C. Polycarp at the Radio
- codeforces 723C. Polycarp at the Radio [模拟]【杂类】
- CodeForces 723C-Polycarp at the Radio(模拟 贪心 vector乱搞)
- Codeforces Round#375 C:Polycarp at the Radio(贪心)
- codefroces 723c Polycarp at the Radio
- Codeforces 723 C. Polycarp at the Radio
- Codeforces 723C.Polycarp at the Radio
- Codeforce 723C - Polycarp at the Radio
- [codeforces723C]Polycarp at the Radio
- CF_C. Polycarp at the Radio
- codeforces Polycarp at the Radio
- [codeforces] C. Polycarp at the Radio 数组统计
- 【23.48%】【codeforces 723C】Polycarp at the Radio
- Codeforces Round #375 (Div. 2)-C. Polycarp at the Radio
- Codeforces Round #375 (Div. 2)C. Polycarp at the Radio
- Codeforces Round #375 (Div. 2) C Polycarp at the Radio
- CodeForces 723C Polycarp at the Radio (贪心+暴力)
- 【神经网络与深度学习】【C/C++】ZLIB学习2
- 求素数最优代码(python)
- codeforces723CPolycarp at the Radio+模拟
- 目标 : webview使用
- 15 关于netbeans7.0.1, c,c++的安装
- Codeforces723 C. Polycarp at the Radio (模拟)
- redis--事务处理与乐观锁
- [LeetCode-Java]31. Next Permutation
- 栈结构的四则运算
- 数据搜索的相关资料
- [Android测试] AS+Appium+Java+Win 自动化测试之八:使用PageObject模式和重封装
- P,V操作
- hashcode和equals方法
- JAVA-泛型