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 }