P14987 全等 个人题解

题目链接

题目大意

给定四个数字 \(a,b,c,d\),要求将这四个数字填入一个 \(2\times2\) 的格子内,使每一列的和都相等,且每一行的和也都相等,判断能否实现。

Solution

感觉很像小时候玩的数独游戏,需要保证每一列的和都相等,且每一行的和也都相等,我们只需要挨个讨论就好。

首先先看给出的前两个子任务测试点,发现当 \(a=b=c=0\) 的时候,只需判断 \(d\) 是否为零就能得出答案;当 \(a=b=0\) 时,判断 \(c\) 是否等于 \(d\) 就能得出答案(其实与上面的本质一样,都是在 \(a=b\) 的时候判断 \(c\) 是否等于 \(d\))。这样我们就已经得到了 \(75\) 分,然后我们逐一分析行和列出现的情况,首先我们确定行可能出现的情况一共就 \(3\) 种,分别是 \(a+b=c+d,a+c=b+d,a+d=c+b\),然后我们在这三种行的情况下去考虑列的情况,可能的情况就是:

  • \(a+b=c+d\) 时:\(a+c=b+d\)\(a+d=b+c\)
  • \(a+c=b+d\) 时:\(a+b=c+d\)\(a+d=c+b\)
  • \(a+d=c+b\) 时:\(a+c=b+d\)\(a+b=c+d\)

然后我们依次按照上面的 \(6\) 种情况讨论就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9'){
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int T=read(); 
int main(){
	while(T--){
		int a=read(),b=read(),c=read(),d=read();
		if(a==b && a==c && c==0){//subtask 1
			if(d==0) puts("Yes");
			else puts("No");
		}
		else if(a==b && a==0){//subtask 2
			if(c==d) puts("Yes");
			else puts("No");
		}
		else if(a+b==c+d){//6种情况分类讨论 
			if(a+c==b+d || a+d==b+c) puts("Yes");
			else puts("No");
		}
		else if(a+c==b+d){
			if(a+b==c+d || a+d==c+b) puts("Yes");
			else puts("No"); 
		}
		else if(a+d==c+b){
			if(a+c==b+d || a+b==c+d) puts("Yes");
			else puts("No");
		}
		else puts("No");
	}
	return 0;
}
posted @ 2026-01-18 17:28  See_you_soon  阅读(1)  评论(0)    收藏  举报