哈理工OJ 295 方方正正(判断01矩阵是否合法)

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2295

方方正正
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 118(32 users) Total Accepted: 30(21 users) Rating: Special Judge: No
Description
一个r行c列的矩阵里的所有元素都为0或1,给出这个矩阵每一行的和以及每一列的和,那么是否存在这样一个矩阵满足条件呢,如果存在任意一个满足条件的矩阵则输出YES,如果不存在则输出NO?

Input
(此行删除)第一行为一个正整数T(T <= 100),表示测试样例的组数。

每组测试数据第一行包含两个整数r,c,表示矩阵的行数和列数。

第二行包含r个32位无符号数,表示矩阵每行的和。

第三行包含c个32位无符号数,表示矩阵每列的和。

(1 <= r,c <= 100000)

处理到文件结束

Output
如果存在这样的一个01矩阵,输出YES,否则输出NO。
Sample Input

1 1

0

1

1 1

1

1

Sample Output
NO

YES

Source
2016级新生程序设计全国邀请赛

【思路分析】判断这个矩阵是不是可以完全由0和1组成,以下5个条件可以判断构不成01矩阵:1.假如一行的和大于列数的话是不合法的,2.一列的和大于行数的话也是不合法的,3.假如某一行的和==列数,那么每一列的和都不能为0,4.假如某一列的和==行数,那么每一行的和都不能为0,5.所有列数的和等于所有行数的和。
【AC代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
#define LL long long

LL r[100005],c[100005];
int main()
{
    LL R,C;
    while(~scanf("%lld %lld",&R,&C))
    {
        LL sum1=0,sum2=0,flag=1,flag1=0,flag2=0;
        for(LL i=1;i<=R;i++)
        {
            scanf("%lld",&r[i]);
            if(r[i]>C)
            {
                flag=0;
            }
            if(r[i]==C)
            {
                flag1=1;
            }
            if(r[i]==0)
            {
                flag2=1;
            }
            sum1+=r[i];
        }
        for(LL i=1;i<=C;i++)
        {
            scanf("%lld",&c[i]);
            if(c[i]>R)
            {
                flag=0;
            }
            if(c[i]==0&&flag1==1)
            {
                flag=0;
            }
            if(c[i]==R&&flag2==1)
            {
                flag=0;
            }
            sum2+=c[i];
        }
        if(sum1!=sum2)
        {
            flag=0;
        }
        if(flag==1)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值