题目6:喷水装置(一)
来源:互联网 发布:淘宝会员注册网站 编辑:程序博客网 时间:2024/05/29 15:11
题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=6
描述
现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri的圆被湿润,这有充足的喷水装置i个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
输入
第一行m表示有m组测试数据
每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
输出
输出所用装置的个数
样例输入
252 3.2 4 4.5 6 101 2 3 1 2 1.2 3 1.1 1 2
算法思路:
这个算法使用的是贪心算法。
如上图所示,首先,将输入半径从大到小进行排序预处理;
然后循环遍历,计算圆所能覆盖的长度,计算temp值,temp = sqrt((r^2 - 1)),圆覆盖的长度为2倍temp值。
求覆盖长度和,判断是否大于20,如果大于,则输出计数值;
否则,计数值加1。
源代码如下:
#include <iostream>#include <vector>#include <algorithm>#include <math.h>using namespace std;bool big_cmp(const double &x, const double &y){ return x > y;}int main(){ int m, n, result; double r, length; vector<double> vec; cin >> m; while (m--) { cin >> n; length = 0; result = 0; vec.clear(); while (n--) { cin >> r; vec.push_back(r); } //半径从大到小进行排序 sort(vec.begin(), vec.end(), big_cmp); //半径从大到小循环遍历 for (vector<double>::iterator it = vec.begin(); it != vec.end() && length < 20; it++) { //计算覆盖长度和 length += 2.0 * sqrt(pow((*it),2.0) - 1); //计数值加1 result++; } //length>=20,输出计数值 cout << result << endl; } return 0;}
阅读全文
0 0
- NYOJ 题目6 喷水装置(一)
- 喷水装置(一)--nyoj题目6
- 南阳题目6-喷水装置(一)
- 题目6 喷水装置(一)
- NYOJ题目6 喷水装置(一)
- NYOJ 题目6 喷水装置(一)
- 题目6:喷水装置(一)
- NYOJ---6(贪心)-题目---------------------------------喷水装置(一)
- NY 题目6 喷水装置(一)(贪心问题)
- NYOJ题目6-喷水装置(一)(贪心)
- 贪心——NYOJ 题目6 喷水装置(一)
- 南阳 oj 贪心 题目6 喷水装置(一)
- NYOJ 题目6 喷水装置(一) 水贪心
- 南阳oj 题目6 喷水装置(一)
- nyoj 题目6:喷水装置(一)贪心算法
- 喷水装置(一)题目及解法
- 6 喷水装置(一)
- nyoj 题目6 喷水装置(贪心)
- js 数值操作(floor ceil abs round)
- Linux之解压缩常用命令
- Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
- leetcode之排序题目总结
- 写一个编程题把ttt5yjd-jdd4yh转换成tttyyyyyjd@jddyyyyh
- 题目6:喷水装置(一)
- OpenCV中矩阵的归一化
- Android面试(Service部分)
- [js]数组去重的几种方法
- Ionic实现左侧侧边栏新建项目
- 深入理解JVM——线程安全与锁优化
- UNIX环境高级编程习题——第五章
- Python中Unicode字符串
- 关于在Hibernate里使用select count(*) 返回值的问题说明