【codeforces题解】2021/3/2 Educational Codeforces Round 105 (Rated for Div. 2)

B. Berland Crossword

题目简要描述:
n*n的格子,U、R、D、L分别代表最上方一行、最右边一列、最下方一行、最左边一列;将一部分边界的格子涂黑,问题研究U、R、D、L中黑格数分别取某些值的情况是否存在。

在这里插入图片描述
我的想法:
U、R、D、L均<=n-2是,一定存在;
于是对其他情况进行暴力讨论。`

#include<iostream>
using namespace std;

int main() {
	ios::sync_with_stdio();
	cin.tie(0);

	int t;
	cin >> t;
	for(int i=0;i<t;++i){
		int n;
		cin >> n;
		int flag = 1;
		int u, r, d, l;
		cin >> u >> r >> d >> l;

		if (u == n && d == n) 
			if (l < 2 || r < 2)	flag = 0;
		if (r == n && l == n)
			if (u < 2 || d < 2)	flag = 0;

		if (u == n && r == n) { if (d == 0 || l == 0) flag = 0; }
		if (d == n && r == n) { if (l == 0 || u == 0) flag = 0; }
		if (d == n && l == n) { if (u == 0 || r == 0) flag = 0; }
		if (u == n && l == n) { if (r == 0 || d == 0) flag = 0; }

		if (u == n) { if (r == 0 || l == 0)	flag = 0; }
		if (r == n) { if (u == 0 || d == 0)	flag = 0; }
		if (d == n) { if (l == 0 || r == 0)	flag = 0; }
		if (l == n) { if (u == 0 || d == 0)	flag = 0; }

		if (u + d == 2 * n - 1)
			if (l + r < 3)	flag = 0;
		if (l + r == 2 * n - 1)
			if (u + d < 3)	flag = 0;

		if (u == n - 1 && d == n - 1)
			if (l+r<=1)	flag = 0;
		if (l == n - 1 && r == n - 1)
			if (u + d <= 1)	flag = 0;

		if (l == n - 1 || r == n - 1)
			if (d + u == 0)	flag = 0;
		if (d == n - 1 || u == n - 1)
			if (r + l == 0)	flag = 0;

		if (flag)	cout << "YES" << endl;
		else        cout << "NO" << endl;
		
	}
}

贴一个补题时看到的大佬的解法

#include <bits/stdc++.h>
using namespace std;
template <typename T> void read(T &t) {
	t=0; char ch=getchar(); int f=1;
	while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
	do { (t*=10)+=ch-'0'; ch=getchar(); } while ('0'<=ch&&ch<='9'); t*=f;
}
int T;
int n,a,b,c,d;
int main() {
	//freopen("1.txt","r",stdin);
	read(T);
	while (T--) {
		read(n),read(a),read(b),read(c),read(d);
		int flag=0;
		for (int t=0;t<16;t++) {
			int A=a,B=b,C=c,D=d;
			if (t&1) A--,B--;
			if (t&2) B--,C--;
			if (t&4) C--,D--;
			if (t&8) D--,A--;
			if (0<=A&&A<=n-2&&0<=B&&B<=n-2&&0<=C&&C<=n-2&&0<=D&&D<=n-2) { flag=1; break; }
		}
		if (flag) puts("YES"); else puts("NO");
	}
	return 0;
}
/*
  0. Enough array size? Enough array size? Enough array size? Integer overflow?
  
  1. Think TWICE, Code ONCE!
  Are there any counterexamples to your algo?
    
  2. Be careful about the BOUNDARIES!
  N=1? P=1? Something about 0?
    
  3. Do not make STUPID MISTAKES!
  Time complexity? Memory usage? Precision error?
*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值