喷水装置
题目描述小赛家有一块草坪,长为20米,宽为2米,妈妈要他给草坪浇水,在草坪上放置半径为Ri的喷水装置,每个喷水装置可以给以它为中心的半径为实数Ri(1<Ri<15)的圆形区域浇水。他家有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润。你能帮他计算一下,把整个草坪全部湿润,最少需要几个喷水装置。
输入
输入第一个数字为喷水装置的个数n,后面n个数字分别为n个喷水装置的半径r,r表示该喷水装置能覆盖的圆的半径。 喷水装置i的范围为:1<i<600,半径的范围为:1<Ri<15。
|
样例输入
5 2 3.2 4 4.5 6
|
输出
输出所用装置的个数。
|
样例输出
2
|
时间限制
C/C++语言:1000MS
其它语言:3000MS
|
内存限制
C/C++语言:65536KB
其它语言:589824KB
|
用到的是贪心思想
里面有一句Arrays.sort(data);
也就是将喷水装置按照半径从小到大的顺序排序
之后选择喷水装置时,从大到小选择
就能“选择尽量少的喷水装置”。
由于喷水装置的覆盖范围是个圆形,但却草坪是长方形
因此,喷水装置的有效覆盖范围只能是个长方形(图中紫色方框)
这个长方形的高是2米,宽是(√(半径*半径-1))*2米
由于整个问题中的图形都是对称的,因此只需要计算一半就行
key=10也就是草坪长度的一半
Math.sqrt(data[i]*data[i]-1)也就是有效覆盖范围的宽的一半。