4. 圆面覆盖 (40分)
问题背景
在平面上有一个长为L,宽为W的长方形,左下角坐标为(0,0),右上角坐标为(L,W)。给定一些圆,第i个圆的圆心坐标为(xi,yi),半径为Ri。
你的任务是求最小的正实数k,使得把每个圆的半径变为原来的k倍后(即:第i个圆半径变为kRi,圆心位置不变),长方形将被这些圆完全覆盖。换句话说,长方形内部或边界上的任意点均至少在一个圆的内部或边界上。
输入格式
输入第一行包含三个整数n, L, W(1<=n<=50,1<=L,W<=1000),即圆的个数、长方形的长和宽。
以下n行,每行三个不超过1000的正整数xi, yi和Ri
输出格式
仅一行,包含一个实数k,保留小数点后三位。
样例输入
1 2 2
1 1 1
样例输出
1.414
听说这题很难,没几个做出来,我知道自己误解题意了,但还是把代码发出来:
#include<stdio.h>
#include<math.h>
int main()
{
int x,y,z,n,l,w,i;
double sum,sum1,max,t1,t2,t3;
scanf("%d%d%d",&n,&l,&w);
sum=0.0;
sum1=32767.0;
while(n--)
{
scanf("%d%d%d",&x,&y,&z);
max=sqrt((double)(x*x+y*y));
t1=sqrt((double)(x*x+(y-w)*(y-w)));
t2=sqrt((double)((x-l)*(x-l)+(y-w)*(y-w)));
t3=sqrt((double)((x-l)*(x-l)+y*y));
if(t1>max)
max=t1;
else if(t2>max)
max=t2;
else if(t3>max)
max=t3;
sum=max/z;
if(sum<sum1)
sum1=sum;
}
printf("%.3f/n",sum1);
return 0;
}