HDU 5655 CA Loves Stick

来源:互联网 发布:电子文件的元数据 编辑:程序博客网 时间:2024/06/06 00:33

CA loves to play with sticks.
One day he receives four pieces of sticks, he wants to know these sticks can spell a quadrilateral.
(What is quadrilateral? Click here: https://en.wikipedia.org/wiki/Quadrilateral)
Input
First line contains TT denoting the number of testcases.
TT testcases follow. Each testcase contains four integers a,b,c,da,b,c,d in a line, denoting the length of sticks.
1≤T≤1000, 0≤a,b,c,d≤263−11≤T≤1000, 0≤a,b,c,d≤263−1
Output
For each testcase, if these sticks can spell a quadrilateral, output “Yes”; otherwise, output “No” (without the quotation marks).
Sample Input
2
1 1 1 1
1 1 9 2
Sample Output
Yes
No

题意:给出四条边的边长问是否能构成一个四边形

解题思路:判定能否构成四边形,需三边之和大于第四边,那么极限情况是最短的三条边之和大于最长的那条边,如果极限情况满足则所有情况都可满足。

http://www.360doc.com/content/14/0819/21/17132703_403176711.shtml

如何判定四边形
1.给定任意四条边是否都可以构成一个四边形?
2.前一个问题的结论包括凹凸两种情况么?
3.如何根据四条边长来判断是否能够构成一个四边形?
4.有一个根据四条边长和一个对角和求四边形的面积的公式是否只针对凸四边形?
1.不一定.只要其中一个边的边长小于另三个边的边长之和,就可以构成一个四边形.
2.如果可以构成四边形,那么就可以形成凹凸两种情况.
3.任意一个边的边长必须小于另三个边的边长之和.
4.不是.同样可以运用到凹四边形.

先对四条边排序,如果有一条边为0,则一定会排到a[0]的位置,判断a[0]是否等于0,如果有长度为0的边一定构不成四边形,输出No.

下面来说说坑:
给出的数据都是在long long边界范围之内,所以要考虑判断数据的情况:

1:a[0]+a[1]+a[2]>a[3]
2:a[0]+a[1]+a[3]>a[2]
3:a[0]+a[2]+a[3]>a[1]
4:a[1]+a[2]+a[3]>a[0]
(任意三边和大于第四边)

如果你想到了三个边界的值相加肯定会超出边界,把式子转化一下,如下:

    if(a[0]>a[3]-a[1]-a[2]&&a[0]>a[2]-a[3]-a[1]&&a[0]>a[1]-a[2]-a[3]&&a[1]>a[0]-a[2]-a[3]) printf("Yes\n");    else printf("No\n");

那么你有没有想到边界值相减也会超出边界= =(没错我也没想到)

但我们不必要判断四种情况,只需判断极限情况:
最短的三边之和大于另一边
即是:

    if(a[0]>a[3]-a[1]-a[2]) printf("Yes\n");    else printf("No\n");

若极限情况满足则所有三边之和大于另一边的情况都满足,就能判断能够构成四边形。

类似的:由两点之间线段最短可类比判断任意多边形的条件是任意n-1条边的和大于另一边,即最短的n-1条边之和大于最长的一边。(只是我自己说的= =)

AC代码:

#include<stdio.h>#include<algorithm>using namespace std;long long a[5];int main(){    int t;      scanf("%d",&t);    while(t--)    {        for(int i=0;i<4;i++)            scanf("%lld",&a[i]);        sort(a,a+4);        if(a[0]==0) printf("No\n");        else        {            if(a[0]>a[3]-a[1]-a[2]) printf("Yes\n");            else printf("No\n");        }    }    return 0;}
原创粉丝点击