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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值