Educational Codeforces Round 44 (Rated for Div. 2) B - Switches and Lamps

匿名 (未验证) 提交于 2019-12-03 00:18:01

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!