当前位置: 代码迷 >> 综合 >> 方方正正——贪心+01矩阵
  详细解决方案

方方正正——贪心+01矩阵

热度:67   发布时间:2024-01-21 01:53:02.0

题目:

方方正正

Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 76(21 users) Total Accepted: 16(13 users) Rating: Special Judge: No
Description

一个rc列的矩阵里的所有元素都为01,给出这个矩阵每一行的和以及每一列的和,那么是否存在这样一个矩阵满足条件呢,如果存在任意一个满足条件的矩阵则输出YES,如果不存在则输出NO

Input

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

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

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

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

(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;
}







革命尚未成功!

  相关解决方案