题目链接: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;
}