喷水装置

来源:互联网 发布:浮云淘宝小号出售平台 编辑:程序博客网 时间:2024/04/29 17:35

喷水装置

题目描述

小赛家有一块草坪,长为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)也就是有效覆盖范围的宽的一半。


0 0