做完B题的时候差不多只剩下45分钟了,当时心里比较着急。
没什么思路,一开始想往dp上面靠。自己dp又烂得一腿,想想又放弃了。
之后想到了配对,比如说11和00配对,10和01配对,这样的话考虑的种数太多。
最后还剩下来20分钟的时候确定了贪心的思路,也就是首先,我们一定要放11,11之后再考虑10和01,如果我们放置了11的话,就说明对应的列上至少加了1,那么我们将10,01的组合起来,也能得到对应的结果。
最后还有个问题,怎么记录答案再输出?一开始我想的很小白,直接模拟再分情况控制输出。这样写起来代码量比较大,还很容易写错。
最后看了YXM学长的代码后,找到了一个很好的写法。
#include "cstdio" #include "cstring" int cnt[5]; int n,m; int map[1111][1111]; void solve(){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) map[i][j]=-1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]!=-1) continue; if(cnt[2]>0) { map[i][j]=3; cnt[2]--; }else{ if(cnt[1]>0){ map[i][j]=1; cnt[1]--; if(cnt[1]>0&&(i+1)<n) { map[i+1][j]=2; cnt[1]--; } } else{ map[i][j]=0; cnt[0]--; } } } } } int main(){ int x; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&x); if(x==0) cnt[0]++; if(x==1||x==10) cnt[1]++; if(x==11) cnt[2]++; } } solve(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]==0) printf("00"); if(map[i][j]==1) printf("01"); if(map[i][j]==2) printf("10"); if(map[i][j]==3) printf("11"); if(j<m-1) printf(" "); } printf("\n"); } return 0; }
codeforces div2 round#231 C
最新推荐文章于 2014-11-05 11:05:02 发布