Swimming Pool(数学)

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,s2 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 1T104 1 ≤ p , q , r , s ≤ 5 × 1 0 8 1\le p,q,r,s\le 5\times 10^8 1p,q,r,s5×108,输入皆为正整数。

思路

  • 首先,要想构成梯形,首先要构成四边形。我们可知知道,四条边可以构成四边形当且仅当任意一边小于另外三边之和,即 p ≤ q + r + s p\le q+r+s pq+r+s 等(共有 4 4 4 个条件)。但这个有点不好判断,因为它要依次搞四条边,很麻烦,因此我们可以:在这里插入图片描述

  • 其次,我们满足了三边之和大于第三边了,那么我们怎么判断它是梯形呢?这边我们得用到平移腰法,因此我们可以画出:

    图片来源

然后我们就可以得到: ∣ s − q ∣ ≤ ∣ p − r ∣ |s-q|\le|p-r| sqpr。然后这道题的代码就很好写了。

代码

//四边之和大于第三边

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值