题目链接:
题意:
给定一条草坪,草坪上有n个喷水装置。草坪长l米宽w米,n个装置都有每个装置的位置和喷水半径。要求出最少需要几个喷水装置才能喷满草坪。喷水装置都是装在草坪中间一条水平线上的。
案例:
Sample Input
8 20 25 34 11 27 210 213 316 219 43 10 13 59 36 13 10 15 31 19 1Sample Output62-1分析:
区间覆盖问题
用贪心,按覆盖最远的排序,每次找最远的然后更行左边界。
这题有个要注意的地方是圆型覆盖,所以在初始化时把其化成矩形覆盖问题,(根据勾股定理转化)
#include#include #include #include #include using namespace std;#define maxn 10100int n,k;double m,w,x,y; struct node{ double l; double r;}a[maxn];int cmp( node a, node b) //按覆盖最远的排序(半径由大到小){ return a.r > b.r; }int main(){while(scanf("%d%lf%lf",&n,&m,&w)!=EOF){ double L=0; k=0; int i=0,j=0; double d;while(n--){scanf("%lf%lf",&x,&y); d=sqrt(y*y-(w*w)/4); //转化为矩形覆盖 a[j].l=x-d; a[j++].r=x+d; }sort(a,a+j,cmp); while(L L) { L=a[i].r; k++; break; } } if(i==j) break; }if(L