Codeforces Round #217前三题(二)

2014-11-24 07:11:01 · 作者: · 浏览: 1
mbered 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 ≤ cim).

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


题目大意:袜子配套,要求尽量多的袜子配对了以后品种不一样。


解题思路:自己思路是正确的,开始还以为自己哪里想错了呢,我觉得就是贪心的思想,先排个序,把小号先放一下,不过左右支要标号,然后再放大号的,详解见代码。


题目地址:C. Mittens


AC代码:

#include
    
     
#include
     
       #include
      
        #include
       
         #include
        
          #include
         
           using namespace std; int a[105]; int p[5002][2]; int main() { int n,m,i,d; while(cin>>n>>m) { memset(a,0,sizeof(a)); memset(p,0,sizeof(p)); for(i=1;i<=n;i++) { scanf("%d",&d); a[d]+=2; //先把各种类的统计出来 } int t=1; int x=0; while(1) //先放小号的 { if(t==n+1) break; for(i=1;i<=m;i++) { if(a[i]>0) { a[i]--; p[t++][x]=i; if(x==0) x=1; else x=0; break; } } } x=1; int flag=0; t=1; while(1) //再放大号的 { if(t==n+1) break; for(i=1;i<=n;i++) { if(a[i]>0) { a[i]--; p[t++][x]=i; if(x==0) x=1; else x=0; break; } } } int ans=0; for(i=1;i<=n;i++) { if(p[i][0]!=p[i][1]) ans++; } cout<