题意:
有n个开关,m盏灯。
一个开关可以控制多个灯,一旦一个灯开了之后,之后再对这个灯的操作就没用了。
问是否存在一个开关,去掉了这个开关之后,按下其它开关之后所有的灯还是亮的。
思路:
首先统计每个灯被按了几次,然后枚举每个开关,把这个开关的贡献去掉,判断是否所有灯的次数大于等于1,然后再回复这个开关的贡献。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int N = 2005; 6 int vis[N]; 7 char s[N][N]; 8 int main() 9 { 10 int n,m; 11 scanf("%d%d",&n,&m); 12 for (int i = 0;i < n;i++) 13 { 14 scanf("%s",s[i]); 15 } 16 for (int i = 0;i < n;i++) 17 { 18 for (int j = 0;j < m;j++) 19 { 20 if (s[i][j] == '1') vis[j]++; 21 } 22 } 23 bool f = 0; 24 for (int i = 0;i < n;i++) 25 { 26 bool ff = 0; 27 for (int j = 0;j < m;j++) 28 { 29 if (s[i][j] == '1') vis[j]--; 30 if (vis[j] == 0) ff = 1; 31 } 32 if (!ff) f = 1; 33 for (int j = 0;j < m;j++) 34 { 35 if (s[i][j] == '1') vis[j]++; 36 } 37 } 38 if (f) puts("Yes"); 39 else puts("No"); 40 return 0; 41 }