题目链接: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;
}