2017/3/24 每天都刷刷ACM练练脑子~ 今天刷了一道debug了很久的题...最后发现..哎还是怪自己太马虎
2017-03-24 21:48
375 查看
喷水装置(二)
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
输出每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。
样例输入
2 2 8 6 1 1 4 5 2 10 6 4 5 6 5
样例输出
12
此题是典型的贪心法 即将每个范围都转化成有效范围 即对应区间上的真实范围(也就是x±根号下r^2-(h/2)^2) 超过了范围的直接记为边界
然后每次都去找当前max中所能延伸的最大区间即贪心思想
#include<iostream> #include<string> #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; class water { public: double x; double realR; double r; double left; double right; }; bool comp(water x, water y) { if (x.left != y.left) return x.left < y.left; else return x.right > y.right; } int main() { int N, n, sum, i, k; double w, h, x, wetS, max, range; cin >> N; while (N--) { cin >> n >> w >> h; sum = 0; wetS = 0; water *nice = new water ; for (i = 0; i < n; i++) { cin >> nice[i].x >> nice[i].r; if (nice[i].r <= (h / 2)) { i--; n--; } else { nice[i].realR = sqrt(pow(nice[i].r, 2) - pow(h / 2, 2)); //计算真实范围 nice[i].left = nice[i].x - nice[i].realR; if (nice[i].left < 0) nice[i].left = 0; nice[i].right = nice[i].x + nice[i].realR; if (nice[i].right>w) nice[i].right = w; //超过了边界的直接记为边界 } } sort(nice, nice + n, comp);//这个排序很好用 max = 0; range = 0; //如果第一个点未能覆盖到0处 肯定是不能浇灌完所有的区间 if (nice[0].left != 0); else { //max就是当前所能找到覆盖最大的区间 while (max < w) { range = max; for (i = 0; i < n&&nice[i].left<=max; i++) { if (nice[i].right>range) { range = nice[i].right; } //不断的去延伸 要是循环结束后range未变 即延伸出现了断点 所以就直接宣布失败 } if (max != range) { max = range; sum++; if (max == w) { break; } } else { sum = 0; break; } } } cout << sum << endl; } return 0; }
相关文章推荐
- ZOJ 1205题解本来是一道大数运算水题,可是却纠结了很久,原因是没能真正读懂题意,要求的计算必须是一一对应输出即使前面出现几个0最后也要把前面的0输出,看别人用C++自己还是两个都提交了结果还是C占的内存少。
- 很多次出错,开始以为自己写的函数有问题,,。。。最后发现少了个%d看来基础还是需要巩固。
- 今天的计算机课上,老师给同学们出了一道题: 输入n个数,请将其中的偶数的二进制反转。 eg:输入1 6 5 其中6是偶数,二进制表示为110,反转后为011,代表3,所以最终输出1 3 5. 小贱君最近脑子不怎么好使,想了半天也没想出来如何做,最后他向你寻求帮助了,帮帮可怜的小贱君吧!
- 每天吃2根香蕉,30天后你会发现自己有惊人的变化!
- 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
- 微软还是没有发现自己的问题!
- 今天发现自己还很不足
- js中我使用hover事件当处于这个div上时显示,离开时慢慢消失,研究了很久,最后发现添加了return就可以了
- 从今天起让自己做一条每天都有梦想的咸鱼
- LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育
- 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
- 小工具 - 批量删除Maven下载失败的文件夹(一直想自己写,最后还是输给了自己)
- 今天发现的百分号表示问题,惭愧自己没学好,哈哈
- 从今天开始,我决定每天发表些自己的学习见解
- 面试是发现缺点,还是发现优点?[zt自己的sina博客]
- 每天为自己充点电还是好的虽然前期的知识有点乏味,但走一步是一步的心态不能变。嗯,加油!If you find a path with no obstacles, it probably doesn’t
- CUGB 1009 DP简单动态规划,此题一开始就结了很久,WA了9次对于刚开始学DP的我打击很大,最后发现原来是方法弄错了,题意没完全弄懂!看了大牛的文章才知道,差距啊!还得好好努力。
- 每天一道ACM(四)
- D-Day +15 of .NET 找到组织了!ohYes~~去学长那里聊了将近1个小时,发现自己学院还是有高人在的!
- 混迹于博客园很久了,今天终于有了自己的博客园:coding-of-love 嘿嘿