http://codeforces.com/contest/394/problem/C
题意:有n*m个骨牌,每个骨牌上有四种样式(“01,10,11,00”),让你重新排列成一个N*M的矩阵,使2*m列的每一列和的最大值最小。
思路:先排序,先正着排全是‘11’的牌,如果在一行,没有排满,用剩下的牌补齐,补齐之后,剩下的每一行都倒着排牌就可以了;如果上面的牌是'10',那么下面的牌是‘01’,上面的牌是‘01‘,那么下面的牌是’10‘;
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 #define maxn 1000100 6 using namespace std; 7 8 int n,m; 9 struct node 10 { 11 int x,y; 12 bool operator <(const node &a)const 13 { 14 return (x+y)>(a.x+a.y); 15 } 16 } p[maxn],q[maxn]; 17 char str[maxn]; 18 int g[1001][1001]; 19 20 int main() 21 { 22 while(scanf("%d%d",&n,&m)!=EOF) 23 { 24 int cnt=0; 25 getchar(); 26 for(int i=1; i<=n; i++) 27 { 28 gets(str); 29 int k=strlen(str); 30 for(int j=0; j<k;) 31 { 32 if(str[j]!=' ') 33 { 34 p[cnt].x=str[j]-'0'; 35 p[cnt++].y=str[j+1]-'0'; 36 j+=2; 37 } 38 else 39 j++; 40 } 41 } 42 sort(p,p+cnt); 43 int x=0,t1=0; 44 bool flag=false; 45 for(int i=1; i<=n; i++) 46 { 47 if(!flag) 48 { 49 for(int j=0; j<m; j++) 50 { 51 if(p[x].x==1&&p[x].y==1) 52 { 53 q[t1].x=1; 54 g[i][j]=t1; 55 q[t1++].y=1; 56 x++; 57 } 58 else 59 { 60 flag=true; 61 for(int k=j; k<m; k++) 62 { 63 q[t1].x=p[x].x; 64 g[i][k]=t1; 65 q[t1++].y=p[x].y; 66 x++; 67 } 68 break; 69 } 70 } 71 } 72 else 73 { 74 for(int j=m-1; j>=0; j--) 75 { 76 int xx=q[g[i-1][j]].x; 77 int yy=q[g[i-1][j]].y; 78 if(xx==1&&yy==0) 79 { 80 if((p[x].x==1&&p[x].y==0)||(p[x].x==0&&p[x].y==1)) 81 { 82 q[t1].x=0; 83 g[i][j]=t1; 84 q[t1++].y=1; 85 x++; 86 } 87 else 88 { 89 q[t1].x=p[x].x; 90 g[i][j]=t1; 91 q[t1++].y=p[x].y; 92 x++; 93 } 94 } 95 else if(xx==0&&yy==1) 96 { 97 if((p[x].x==1&&p[x].y==0)||(p[x].x==0&&p[x].y==1)) 98 { 99 q[t1].x=1; 100 g[i][j]=t1; 101 q[t1++].y=0; 102 x++; 103 } 104 else 105 { 106 q[t1].x=p[x].x; 107 g[i][j]=t1; 108 q[t1++].y=p[x].y; 109 x++; 110 } 111 } 112 else 113 { 114 q[t1].x=p[x].x; 115 g[i][j]=t1; 116 q[t1++].y=p[x].y; 117 x++; 118 } 119 } 120 } 121 } 122 for(int i=1; i<=n; i++) 123 { 124 for(int j=0; j<m; j++) 125 { 126 printf("%d%d ",q[g[i][j]].x,q[g[i][j]].y); 127 } 128 printf("\n"); 129 } 130 } 131 return 0; 132 }