圆有点挤

来源:互联网 发布:光环大数据培训 梁勇 编辑:程序博客网 时间:2024/04/27 15:54
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<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){int t,a,b,r1,r2;scanf("%d",&t);while(t--){scanf("%d%d%d%d",&a,&b,&r1,&r2);if(a<b) swap(a,b);if(r1<r2) swap(r1,r2);if(2*r1>b||2*r2>b||(b-(r1+r2))<0||(a-(r1+r2))<0){printf("NO\n");}else{int t1=b-(r1+r2),t2=a-(r1+r2);if(t1*t1+t2*t2>=(r1+r2)*(r1+r2))printf("YES\n");else printf("NO\n");}}return 0;}


0 0
原创粉丝点击