题目链接:http://codeforces.com/contest/985/problem/B
题意:每个开关控制至少一个台灯,多个开关同时按下不会使台灯从亮变暗再变亮,保证按下所有开关后所有台灯都会亮。
输出是否存在这样一个开关,去掉它后利用剩下的开关仍然能点亮所有台灯。
题解:我们要寻找不是独一无二的开关,那就先统计每个台灯被多少个开关管,记录在vis【】中。然后遍历每个开关,看这个开关是否是某个台灯的独一无二(独一无二的意思是,如果去掉了这个开关,这盏台灯就绝对无法点亮)。如果这个开关不是独一无二的,那就说明至少存在一个符合题意的可以去掉的开关,输出“YES”,找不到,就输出“NO”
代码:
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #define N 2005 //一个开关可能可以开多个台灯 //如果开关对于其中一盏台灯是独一无二的,这个开关就不在考虑范围内 //如果有一个开关不是独一无二,就决定可以是它了,输出yes using namespace std; char an[N][N]; int vis[N]; int main() { int row,col,flag; cin>>row>>col; memset(vis,0,sizeof(vis)); for(int i=1;i<=row;++i) { for(int j=1;j<=col;++j) { cin>>an[i][j]; if(an[i][j]=='1') vis[j]++;//这盏灯受控的台灯数+1 } } for(int i=1;i<=row;++i)//把独一无二的选出 { flag=1; for(int j=1;j<=col;++j) { if(vis[j]==1&&an[i][j]=='1') { flag=0;//这个开关是独一无二的 break; } } if(flag==1)//找到了不是独一无二的开关 break; } if(flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }