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;
}

浙公网安备 33010602011771号