您的位置:首页 > 其它

CodeForces 370C

2013-12-08 14:55 141 查看
这道题其实是挺简单的。首先很容易发现最多人用的颜色的人数如果大于n/2,就肯定不能让全部人都成功戴上两只不同颜色的手套。反过来想,如果这个人数小于等于n/2又如何呢?的确,这就能让全部人都能戴上两只不同颜色的手套(每个人都留一只自己原本的,再要别人的一只手套就可以了)。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <bitset>
#include <cstring>
#include <list>
using namespace std;
struct Child{
int color, num, mat;
};
bool partition_cmp(const Child& c1, const Child& c2){
return c1.color < c2.color;
}
bool sort_cmp(const Child& c1, const Child& c2){
return c1.num < c2.num;
}
int main(){
int n, m;
Child a[5000];
int c[101];
cin >> n >> m;
for (int i = 1; i <= m; i++){
c[i] = 0;
}
for (int i = 0; i < n; i++){
cin >> a[i].color;
a[i].num = i;
c[a[i].color]++;
}
int mx = 0;
for (int i = 1; i <= m; i++){
if (c[mx] < c[i]){
mx = i;
}
}
if (c[mx] * 2 > n){
cout << 2 * (n - c[mx]) << endl;
int mcount = 0, miter = -1, d = n - c[mx];
for (int i = 0; i < n; i++){
if (a[i].color == mx){
cout << a[i].color << " ";
if (d > 0){
for (miter++; miter < n && a[miter].color == mx; miter++);
cout << a[miter].color << endl;
d--;
}
else{
cout << a[i].color << endl;
}
}
else{
cout << a[i].color << " " << mx << endl;
}
}
}
else{
cout << n << endl;
sort(a, a + n, partition_cmp);
for (int i = 0; i < n; i++){
a[i].mat = a[(i + c[mx]) % n].color;
}
sort(a, a + n, sort_cmp);
for (int i = 0; i < n; i++){
cout << a[i].color << " " << a[i].mat << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: