codeforces div2 round#231 C

做完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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值