题目: 方方正正 |
||||||
|
||||||
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;elsecout<<"NO"<<endl;}return 0;
}
革命尚未成功!