Swimming Pool
题目背景
请注意,四边形 A B C D ABCD ABCD 中,四个点必须顺次是 A , B , C , D A,B,C,D A,B,C,D,不允许 A B AB AB 是一条对角线之类的情况。
题目描述
小 J 想要建一个四边形游泳池 A B C D ABCD ABCD。他希望有一组对边互相平行(方便搞一些家庭比赛),另外一组对边不平行(否则会显得太没有个性)。换言之,他需要让这个游泳池是个梯形。
给出四个正整数 p , q , r , s p,q,r,s p,q,r,s,判断他能否造一个符合题意的游泳池,使得 A B = p , B C = q , C D = r , D A = s AB=p,BC=q,CD=r,DA=s AB=p,BC=q,CD=r,DA=s。
输入格式
本题有多组数据。 输入的第一行有一个正整数 T T T 表示数据组数。
之后 T T T 行,每行有用空格隔开的四个正整数 p , q , r , s p,q,r,s p,q,r,s。
输出格式
对于每组数据输出
T
T
T 行,其中若可以构成梯形则输出 yes
,否则输出 no
。
样例 #1
样例输入 #1
3
20 2 4 8
3 5 3 5
1 2 4 3
样例输出 #1
no
no
yes
提示
【样例解释】
第一组数据显然无法构成四边形。
第二组数据只能构成平行四边形。
第三组数据确实可以构成梯形。
【数据范围】
本题共 6 6 6 个测试点,注意测试点不等分。
测试点编号 | 特殊性质 | 分值 |
---|---|---|
1 1 1 | 可构成梯形当且仅当可构成四边形 | 19 19 19 |
2 2 2 | p < r < s p<r<s p<r<s 且 q < s q<s q<s | 17 17 17 |
3 3 3 | p , q , r , s ≤ 2 p,q,r,s\le 2 p,q,r,s≤2 | 7 7 7 |
4 4 4 | p < r p<r p<r 且 q < s q<s q<s | 12 12 12 |
5 5 5 | 输入必能构成四边形 | 18 18 18 |
6 6 6 | 无特殊性质 | 27 27 27 |
对于全体数据,保证 1 ≤ T ≤ 1 0 4 1\le T\le 10^4 1≤T≤104, 1 ≤ p , q , r , s ≤ 5 × 1 0 8 1\le p,q,r,s\le 5\times 10^8 1≤p,q,r,s≤5×108,输入皆为正整数。
思路
-
首先,要想构成梯形,首先要构成四边形。我们可知知道,四条边可以构成四边形当且仅当任意一边小于另外三边之和,即 p ≤ q + r + s p\le q+r+s p≤q+r+s 等(共有 4 4 4 个条件)。但这个有点不好判断,因为它要依次搞四条边,很麻烦,因此我们可以:
然后我们就可以得到: ∣ s − q ∣ ≤ ∣ p − r ∣ |s-q|\le|p-r| ∣s−q∣≤∣p−r∣。然后这道题的代码就很好写了。
代码
//四边之和大于第三边
#include<iostream>
#include<algorithm>
using namespace std;
int T;
int w[6];
int main(){
cin>>T;
while(T--){
int a,b,c,d;
cin>>a>>b>>c>>d;
if(2*max({a,b,c,d})>=a+b+c+d||abs(a-c)==abs(b-d)){
puts("no");
}else{
puts("yes");
}
}
return 0;
}