NYOJ 12 喷水装置(二)
来源:互联网 发布:淘宝买家采集器破解版 编辑:程序博客网 时间:2024/05/16 19:22
题目链接 http://acm.nyist.net/JudgeOnline/problem.php?pid=12
题目
描述
有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入
第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
样例输入:
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
输出
每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。
样例输出:
1
2
解题思路
- 题目意思就是在[0,w]区间上,尽可能少的用给出的固定区间填满。给出的喷头坐标与半径需要转换以存储方便使用
- 贪心算法
- 遍历数组寻找一个左边在起点b左边并且右边界最大的区间maxR,找到以后就将这个右边界作为新的起点b,循环,直到maxR>=w
代码(C++)
#include <bits/stdc++.h>using namespace std;const int M = 10000+5;struct pen{ //定义区间结构体,元素l,r分别为区间的左右边界 double l,r;};int main(){ pen a[M] = {0}; int N; cin>>N; while(N--){ int n,w,h; cin>>n>>w>>h; for(int i=0;i<n;i++){//读入x,r 并将其转化后存入数组中 int x,r; cin>>x>>r; double z = 0; //若喷头的纵向不能达到边界,则其区间长度为零,不影响后边的使用 if(r>h/2.0) z = sqrt(r*r-h*h/4.0); a[i].l = x-z; a[i].r = x+z; } double b=0,maxR=0; int cnt=0,flag=0; while(b<w){ //遍历数组,找到左边界在起点左边、有边界在起点右边的右边界最大的最大值,存入maxR for(int j=0;j<n;j++){ if(a[j].l<=b && a[j].r>=b){ maxR = maxR>a[j].r?maxR:a[j].r; } } //若没找到更大的,说明不能在往右延伸了,方案不存在,输出0结束测试 if(b == maxR){ cout << 0 << endl; flag = 1; break; } b = maxR; cnt++; } if(!flag) cout << cnt <<endl; }}
运行结果
阅读全文
0 0
- NYOJ 12-喷水装置二
- nyoj 12 喷水装置二
- nyoj 12 喷水装置二
- NYOJ 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- nyoj 12 喷水装置(二)
- NYOJ 题目12喷水装置(二)
- NYOJ 12 喷水装置(二)
- Nyoj 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- nyoj 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- NYOJ-12-喷水装置(二)
- nyoj 12 喷水装置(二)
- NYOJ--12--喷水装置(二)
- NYOJ 12 喷水装置(二)
- [H.264] 视频压缩原理
- Oracle Scott解锁
- Friend Circles
- ES6 Map Set总结
- Java面试题集(第二部分)(51-70)
- NYOJ 12 喷水装置(二)
- CoreBluetooth连接蓝牙健康设备
- 中国最好的jdbc连接池-------Druid开源连接池的使用
- 虚拟机里的vmnet1 和vmnet8
- 机器人路径规划
- Opencv学习之寻找和绘制物体的凸包
- 用JavaScript制作钟表
- Java面试题集(第三部分)(51-70)
- 汉诺塔通项公式证明