题面
给定两个圆和一个矩形,判断两个圆能否放入矩形内。其中,a,b,r1,r2都是浮点数。
分析
考虑两个圆能够放入的一个最基本的必要条件是:半径大的圆放进去后,半径小的圆还可以放进去。也就是满足
min(a,b)>=max(r1,r2)*2
接下来就分析能否放入的临界点,设想右侧短边是一个可以滑动的挡板,从右向左滑动。当a特别大的时候,两个圆靠近呈相切状态,两个圆可以同时与底面相切(但是这并不意味着最节省空间。。。)当矩形不断内缩时,达到临界状态,两个圆分别和矩形相对的边相切,即理想状态下每条边只与一个圆相切。这个时候,就不可以再继续收缩了。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
bool judge(double a,double b,double r1,double r2)
{
if (a>b) swap(a,b);
if (r1>r2) swap(r1,r2);
if (a<r2*2) return 0;
double z=r1+r2,x=a-z,y=b-z;
return x*x+y*y>=z*z;
}
int main()
{
double a,b,r1,r2;
while(scanf("%lf%lf%lf%lf",&a,&b,&r1,&r2)!=EOF)
{
if (judge(a,b,r1,r2)) printf("YES\n");
else printf("NO\n");
}
return 0;
}