题目的意思就是有一块长为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;
}
}