输入包含多组数据,EOF结束。
每组数据包含一行,分别是两个实数w和h代表矩形的长和宽。
0<w,h<10000
2.000 1.000
0.500
思路:我们可以以矩形的一个顶点为原点坐标(0,0),那么其斜对角的坐标为(w,h)
而这两个圆可以看做是从这两个点开始吹的气球
那么我们可以二分其半径
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define exp 1e-8
int main()
{
double h,w,l,r,mid,x,y,mid2;
while(~scanf("%lf%lf",&w,&h))
{
if(w<h)
swap(w,h);
l = 0,r = h/2;
while(r-l>exp)
{
mid = (l+r)/2;//原点出发的圆的半径
x = w-mid;//求出(w,h)出发的圆的圆心坐标
y = h-mid;
mid2 = sqrt((mid-x)*(mid-x)+(mid-y)*(mid-y))/2.0;//两圆心的距离除以2
if(mid>mid2)
r = mid;
else
l = mid;
}
printf("%.3f\n",l);
}
return 0;
}
ACdream1034:the cover circle,布布扣,bubuko.com
原文:http://blog.csdn.net/libin56842/article/details/26821999