You are given n switches and m lamps. The i-th switch turns on some subset of the lamps. This information is given as the matrix aconsisting of n rows and m columns where ai, j = 1 if the i-th switch turns on the j-th lamp and ai, j = 0 if the i-th switch is not connected to the j-th lamp.
Initially all m lamps are turned off.
Switches change state only from "off" to "on". It means that if you press two or more switches connected to the same lamp then the lamp will be turned on after any of this switches is pressed and will remain its state even if any switch connected to this lamp is pressed afterwards.
It is guaranteed that if you push all n switches then all m lamps will be turned on.
Your think that you have too many switches and you would like to ignore one of them.
Your task is to say if there exists such a switch that if you will ignore (not use) it but press all the other n - 1 switches then all the mlamps will be turned on.
The first line of the input contains two integers n and m (1 ≤ n, m ≤ 2000) — the number of the switches and the number of the lamps.
The following n lines contain m characters each. The character ai, j is equal to '1' if the i-th switch turns on the j-th lamp and '0' otherwise.
It is guaranteed that if you press all n switches all m lamps will be turned on.
Print "YES" if there is a switch that if you will ignore it and press all the other n - 1 switches then all m lamps will be turned on. Print "NO" if there is no such switch.
4 5 10101 01000 00111 10000
YES
4 5 10100 01000 00110 00101
NO
题意:给你n行m列的0 1序列,每行代表一种开关,每列代表一个位置的灯泡,0代表关闭,1代表开启,只要该位置有一个开关开启该灯泡就会亮,求如果去掉某一个开关(即去掉某一行)所有位置的灯泡是否仍然都亮。
思路:大暴力,遍历去掉每一个开关,判断是否存在都亮的情况。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
const int maxn = 2005;
char s[maxn][maxn];
int a[maxn];
int main()
{
int n, m;
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++) {
scanf("%s", s[i]);
}
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
a[j] += s[i][j]-'0';
}
}
int flag;
for (int i = 0; i < n; i ++) {
flag = 1;
for (int j = 0; j < m; j ++) {
if (a[j] - (s[i][j]-'0') == 0) {
flag = 0;
break;
}
}
if (flag) {
break;
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
本文探讨了给定n个开关和m个灯泡的情况下,如何通过移除其中一个开关,判断剩余开关是否仍能点亮所有灯泡的问题。采用暴力遍历的方法进行验证,并提供了完整的C++实现代码。
1292

被折叠的 条评论
为什么被折叠?



