时间限制:3000ms | 内存限制:65535KB
难度:3
-
描述
-
现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
-
输入
-
第一行m表示有m组测试数据
每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
输出
- 输出所用装置的个数 样例输入
-
2 5 2 3.2 4 4.5 6 10 1 2 3 1 2 1.2 3 1.1 1 2
样例输出
-
2 5
这道题相比之前几道题要难一些,难点就在这道题要分析什么情况下喷水装置喷水面积能覆盖草坪面积,同时又要喷水装置最少。
分析:因为喷水装置是放在草坪横中心线上,所以只要使喷水装置半径和草坪宽度的一半组成的直角三角形的另一边长度和大于等于20即可。具体程序实现如下:
#include <stdio.h> #include <math.h> #define PI 3.1415926 int main() { int n,num,i=0,j; float radius[600],tmp,d; scanf("%d",&n); while(n--) { d=0; scanf("%d",&num); for(i=0;i<num;i++) scanf("%f",&radius[i]); for(i=0;i<num-1;i++) //排序,大的在前 for(j=i+1;j<num;j++) if(radius[i]<radius[j]) { tmp=radius[i]; radius[i]=radius[j]; radius[j]=tmp; } i=0; //要使喷水装置半径和草坪宽度的一半组成的直角三角形的另一边长度和大于等于20 while(!(d>=20) ) { d +=2*sqrt(radius[i]*radius[i]-1); i++; } printf("%d\n",i); } return 1; }
运行时间0,内存228。
-
第一行m表示有m组测试数据