ACdream 1098——圆有点挤——————【数学计算】

圆有点挤
Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu

Description

gg最近想给女友送两个精美的小礼品:两个底面半径分别为R1和R2的圆柱形宝石,并想装在一个盒子里送给女友。好不容易找到了一个长方体的盒子,其底面为A*B的矩形,他感觉好像宝石装不进去,但又不敢轻易塞进去试试。现请你帮他判断两个宝石能否放进盒子里(宝石只能竖直放置,且不能堆叠)。

Input

输入的第一行是一个整数,为数据的组数t(t<=1000)。

每组数据占一行,包括4个数A,B,R1,R2,均为不超过1e4的正整数。

Output

对于每组数据,若两个宝石能放进盒子中,则输出YES,否则输出NO。

Sample Input

2

10 10 1 1

10 10 4 4

Sample Output

YES

NO


解题思路:特判两个圆平放的情况,处理两个圆斜放的情况,矩形两边减去大小圆半径和后,与圆心距构成一个直角三角形,如果斜边平方大于两直角边平方和,两个圆相离,可放;如果两个斜边平方等于两直角边平方和,两圆相切,可放;如果两个斜边平方小于两直角边平方和,两圆相交,不可放。


#include<stdio.h>

#include<algorithm>

#include<string.h>

using namespace std;

int main(){



    int t;

    scanf("%d",&t);

    while(t--){



        int A,B,R1,R2;

        scanf("%d%d%d%d",&A,&B,&R1,&R2);

        if(A>B) swap(A,B);

        if(R1>R2)swap(R1,R2);

        int difA=A-R1-R2;

        int difB=B-R1-R2;



        if(2*R1>A||2*R2>A||difA<0||difB<0){



            printf("NO\n");

        }else{



            difA*=difA;

            difB*=difB;

            int dif=R1+R2;

            dif*=dif;

            if(dif>difA+difB){



                printf("NO\n");

            }else{



                printf("YES\n");

            }

        }

    }

    return 0;

}

  

 


你可能感兴趣的:(数学)