P10245 Swimming Pool

· · 题解

题目大意

给定二组对边 AB, CD 和 AD, BC,问是否能组成梯形 ABCD。

思路

手画了一个……丑请见谅~

假设 AB, CD 平行。固定其中较长的边 AB ,同时设 CD 平行 AB 。令 \angle \alpha 为 AD 与 AB 的夹角,则当边 AD 绕点 A 旋转时,CB 的长会随着 \angle \alpha 的变化而变化。它的最大值就在 \angle \alpha = 180 ^\circ 时,CB = AB + AD - CD ,它的最小值就在 \angle \alpha = 0 ^\circ 时, CB = AB + AD - CD 。这里因为 CB 有可能小于 0 ,所以 CB 的最小值 要取 max \left ( 0, CB \right ) 。接下来只要判断 CB 是否在这个区间内即可。注意,如果这一次判断的值为假,有可能是平行的那组边选错了,这时候我们把 AD 和 BC 作为平行边,重复一次。如果还是假,就说明不是梯形,输出 no 。

代码如下。

#include <iostream>
#include <algorithm>
using namespace std;

int T;

signed main(){
    ios::sync_with_stdio(0);
    cin >> T;
    for (int i = 0; i < T; ++i){
        int a, b, c, d;
        cin >> a >> b >> c >> d;

        int Max = max(a, c) + min(b, d) - min(a, c), Min = max(a, c) - min(b, d) - min(a, c);
        if (max(b, d) < Max && max(b, d) > Min){
            cout << "yes" << endl;
        }else{
            Max = max(b, d) + min(a, c) - min(b, d), Min = max(0, max(b, d) - min(a, c) - min(b, d));
            if (max(a, c) < Max && max(a, c) > Min){
                cout << "yes" << endl;
            } 
            else{
                cout << "no" << endl;
            }
        }
    }
    return 0;
}

蒟蒻的第一篇题解,审核大大求过 QAQ