UVA10382

来源:互联网 发布:centos nfs安装配置 编辑:程序博客网 时间:2024/06/10 20:11

题目的意思就是有一块长为l ,宽为 w的草地。要给它浇水。

现在有n个喷头,都在中心线上。

每个喷头给出它的位置,和半径,问最少拿几个喷头可以全部喷满草地。


要把圆形转化为矩形,其实一个圆形区域的有效范围 只有圆形与草地的四个交点所组成的矩形,我们要通过圆心位置和半径,把它转化为左边界,右边界,然后就是一般的最小覆盖。还有要注意的是如果一个喷头的半径不足宽的一半,就可以直接删了它了。。

ac代码:


#include<iostream>#include<cmath>#include<algorithm>using namespace std;const int N = 10005;double n,l,w;struct node {double l;double r;}p[N];int cmp (node a ,node b) {return a.l < b.l;}node cul (double cen ,double ra) {node temp;temp.l = cen - sqrt(ra * ra - (w / 2) * (w / 2));temp.r = cen + sqrt(ra * ra - (w / 2) * (w / 2));return temp;}int main () {while (cin >> n >> l >> w) {int num = 0;double cen ,ra;for (int i = 0 ; i < n ;i++) {cin >> cen >> ra ;if (ra < w / 2)continue;else {p[num++] = cul(cen , ra);}}sort(p ,p + num ,cmp);//for(int i = 0 ; i < num ;i++) {//cout << p[i].l << endl;//}//cout << endl;double mi = 0;int t = 0;if (p[0].l > 0) {cout << "-1" <<endl;continue;}//cout << p[0].l << endl << endl;while (mi < l) {double temp = mi;for (int i = 0 ;i < num ;i++) {if (p[i].l <= mi && p[i].r > temp)temp = p[i].r;}if (temp == mi) {t = -1;break;}mi = temp;t++;}cout << t << endl;}}


0 0
原创粉丝点击