cf B. Two Heaps

http://codeforces.com/contest/353/problem/B

题意:要把2*n个两位数分成两部分,使得第一部分上的数和第二部分上的两位数组成四位数。求怎么分能使构成的不同的四位数个数最多

如果2*n个数都是不同的,怎么分都一样的组成n*n个。如果有相同的,将它们按数量排序,均分到两个集合中就可以。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <map>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int n;
 8 int num[100010];
 9 int a[10010],b[10010];
10 struct node
11 {
12     int x;
13     int id;
14     int flag;
15     int num;
16     bool operator <(const node &a)const
17     {
18         return (num<a.num)||(num==a.num&&x<a.x);
19     }
20 }p[100010];
21 
22 bool cmp(node a,node b)
23 {
24     return a.id<b.id;
25 }
26 int main()
27 {
28     while(scanf("%d",&n)!=EOF)
29     {
30         int cnt=0;
31         memset(num,0,sizeof(num));
32         for(int i=1; i<=2*n; i++)
33         {
34             int m;
35             scanf("%d",&m);
36             p[cnt].id=i;
37             p[cnt++].x=m;
38             num[m]++;
39         }
40         for(int i=0; i<cnt; i++)
41         {
42             p[i].num=num[p[i].x];
43         }
44         sort(p,p+cnt);
45         int t1=0,t2=0;
46         for(int i=0; i<cnt; i+=2)
47         {
48             p[i].flag=1;
49             if(!a[p[i].x])
50             {
51                 a[p[i].x]++;
52                 t1++;
53             }
54             p[i+1].flag=2;
55             if(!b[p[i+1].x])
56             {
57                 b[p[i+1].x]++;
58                 t2++;
59             }
60         }
61         printf("%d\n",t1*t2);
62         sort(p,p+cnt,cmp);
63         for(int i=0; i<cnt; i++)
64         {
65             if(i==0)
66             {
67                 if(p[i].flag==1)
68                 printf("1");
69                 else
70                     printf("2");
71             }
72             else
73             {
74                 if(p[i].flag==1)
75                     printf(" 1");
76                 else printf(" 2");
77             }
78         }printf("\n");
79     }
80     return 0;
81 }
View Code

 

  

posted @ 2014-08-23 11:04  null1019  阅读(158)  评论(0编辑  收藏  举报