Codeforces Round #217 (Div. 2) c题

C. Mittens
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

A Christmas party in city S. had n children. All children came in mittens. The mittens can be of different colors, but each child had the left and the right mitten of the same color. Let's say that the colors of the mittens are numbered with integers from 1 to m, and the children are numbered from 1 to n. Then the i-th child has both mittens of color ci.

The Party had Santa Claus ('Father Frost' in Russian), his granddaughter Snow Girl, the children danced around the richly decorated Christmas tree. In fact, everything was so bright and diverse that the children wanted to wear mittens of distinct colors. The children decided to swap the mittens so that each of them got one left and one right mitten in the end, and these two mittens were of distinct colors. All mittens are of the same size and fit all the children.

The children started exchanging the mittens haphazardly, but they couldn't reach the situation when each child has a pair of mittens of distinct colors. Vasily Petrov, the dad of one of the children, noted that in the general case the children's idea may turn out impossible. Besides, he is a mathematician and he came up with such scheme of distributing mittens that the number of children that have distinct-colored mittens was maximum. You task is to repeat his discovery. Note that the left and right mittens are different: each child must end up with one left and one right mitten.

Input

The first line contains two integers n and m — the number of the children and the number of possible mitten colors (1 ≤ n ≤ 5000, 1 ≤ m ≤ 100). The second line contains n integers c1, c2, ... cn, where ci is the color of the mittens of the i-th child (1 ≤ ci ≤ m).

Output

In the first line, print the maximum number of children who can end up with a distinct-colored pair of mittens. In the next n lines print the way the mittens can be distributed in this case. On the i-th of these lines print two space-separated integers: the color of the left and the color of the right mitten the i-th child will get. If there are multiple solutions, you can print any of them.

Sample test(s)
Input
6 3 1 3 2 2 1 1
Output
6 2 1 1 2 2 1 1 3 1 2 3 1
Input
4 2 1 2 1 1
Output
2 1 2 1 1 2 1 1 1

题意:n付手套,手套的颜色m种,任意两个人之间可以交换手套,让你求出最多可以使多少人满足左手和右手的手套颜色不同。
分析:当时比赛的时候是用了两个for循环,但第二个for循环是从i+1开始的,所以导致有些情况是漏掉的,如果第二个for循环改成从1开始的话就能过的,学了下别人的方法,具体看代码实现!
代码实现:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int a[5050],l[5050],r[5050],kind[105];
int n,m;

int main()
{
    int i,Max,res;
    scanf("%d%d",&n,&m);
    memset(kind,0,sizeof(kind));
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        kind[a[i]]++;
    }
    sort(a,a+n);
    Max=0;
    for(i=1;i<=m;i++)
     if(kind[i]>Max)
      Max=kind[i];
    if(Max*2>n)
     res=(n-Max)*2;
    else
     res=n;
    for(i=0;i<n;i++)
    {
        l[i]=a[i];
        r[i]=a[(i+Max)%n];
    }
    printf("%d\n",res);
    for(i=0;i<n;i++)
     printf("%d %d\n",l[i],r[i]);
    return 0;
}

 










转载于:https://www.cnblogs.com/jiangjing/p/3465622.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值