cf C. Dominoes

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 }
View Code

 

posted @ 2015-01-27 10:13  null1019  阅读(188)  评论(0编辑  收藏  举报