方方正正 | ||||||
| ||||||
Description | ||||||
一个r行c列的矩阵里的所有元素都为0或1,给出这个矩阵每一行的和以及每一列的和,那么是否存在这样一个矩阵满足条件呢,如果存在任意一个满足条件的矩阵则输出YES,如果不存在则输出NO? | ||||||
Input | ||||||
每组测试数据第一行包含两个整数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级新生程序设计全国邀请赛 |
思路:01矩阵的贪心问题。
主要是两个判定:
1、总行和等于总列和
2、每一个行和不大于有效的列的数目,每一个列和不大于有效的行的数目
3、如果一个行和为0,行数减一,也就是说列的和的上限减一;列也一样
主要思路能想明白就好,易错点是行数和列数的对应
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int x[1000000],y[1000000];
int main(){
int mx,my,sum1,sum2;
int n,m;
while(~scanf("%d %d",&n,&m)){
int flag=0,a,b;
mx=0,my=0,my=0,sum1=0,sum2=0;;
a=m;
b=n;
for(int i=0;i<n;i++){
scanf("%d",&x[i]);
sum1+=x[i];
if(x[i]==0)
b--;
}
for(int i=0;i<m;i++){
scanf("%d",&y[i]);
sum2+=y[i];
if(y[i]==0)
a--;
}
for(int i=0;i<n;i++){
if(x[i]>a){
flag=1;
break;
}
}
for(int i=0;i<m;i++){
if(y[i]>b){
flag=1;
break;
}
}
if(sum1==sum2&&!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
革命尚未成功!