AcWing 每日一题 3711. 方格涂色(CF1494B)

原题链接

在这里插入图片描述
输出格式
每组数据输出一行结果,如果存在合理方案,则输出 YES,否则输出 NO。

数据范围
1≤t≤1000,
2≤n≤100,
0≤U,R,D,L≤n
输入样例:
4
5 2 5 3 1
3 0 0 0 0
4 4 1 4 0
2 1 1 1 1
输出样例:
YES
YES
NO
YES
样例解释
下面是样例 1,2,4 的可行方案:

在这里插入图片描述


对于每个方向的涂色的数量可以分成两部分,一个是可以影响其他方向的角,还有不会影响其他方向的边。

只有角是会影响到其他方向的,最难处理的也是角
所以我们可以二进制枚举四个角的情况,如果要求的值减去角的值大于等于0,小于等于n-2,那么就可行(边可以涂0到n-2个)

AC代码:

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,U,D,L,R;
		scanf("%d %d %d %d %d",&n,&U,&R,&D,&L);
		bool flag=0;
		for(int i=0;i<=15;++i){
			int u,d,l,r;
			u=(1&(i>>3))+(1&(i>>2));
			r=(1&(i>>2))+(1&(i>>1));
			d=(1&(i>>1))+(1&(i));
			l=(1&(i))+(1&(i>>3));
			if(U-u>=0&&U-u<=n-2
			&&D-d>=0&&D-d<=n-2
			&&L-l>=0&&L-l<=n-2
			&&R-r>=0&&R-r<=n-2){
				flag=1;
				break;
			}
		}
		if(flag)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值