cf1360G

1360G 1900

题意:对一个长度为m高度为n的全为零二维数组进行操作也就是ar[n][m], 令其每列横行1的个数为a,每排纵行的1的个数为b,
如下所示、
在这里插入图片描述
该数组的a=2,b=1,问你是否存在这么一个ar[n][m]数组使得其满足a和b的要求,如果存在打印“YES”且打印出这个数组,若不存在,则打印“NO”。
思路:首先判断这个数组是否存在,这个是相对来说比较简单的,可以知道这个数组的和也就是所有的横行的1相加的和或者说所有纵行的1相加的和,SUM = an=bm,如果不满足这个条件肯定是不存在这个二维数组的,但如果相等,那么就存在。
对于存在的数组中‘1’的排列,可以对于每行的‘1’的排列进行平移a个位置,举个例子
对于3 6 2 1的数组可以
1 1 0 0 0 0
0 0 1 1 0 0
0 0 0 0 1 1
这样排列,如果排列超出了这个数组的长度限制则对m取余也就是每行的格数。最后不难得到答案
具体实现看代码

int main(){
    IOS;
    int t;
    cin>>t;
    while(t--){
        int n, m, a, b;
        cin>>n>>m>>a>>b;
        int ar[100][100];
        memset(ar, 0, sizeof(ar));
        if(n*a!=b*m){
            cout<<"NO"<<endl;
            continue;
        }else cout<<"YES"<<endl;
        int x = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < a; j++){
                ar[i][x] = 1;
                x++;
                x = x%m;
            }
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                cout<<ar[i][j];
            }
            cout<<endl;
        }
    }
    return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值