UVa 10382

来源:互联网 发布:linux拷贝隐藏文件 编辑:程序博客网 时间:2024/05/16 15:55

题目:有一块矩形草坪,在中线上有n个喷淋头,可以浇灌圆形的区域,选择最少的喷淋头覆盖整个矩形区域。

分析:贪心、会议时间安排。将每个喷淋头转化成对应的区间(计算左右交点),按左交点排序贪心即可。

            过程同会议时间安排,这里取区间相交(时间安排取不想交);

            按左交点排序,每次找到能够覆盖上次结束位置(右交点)的最远点(右交点最大的)即可。

说明:判定不能覆盖的圆的时候用了平方,导致溢出,查了好久才发现~~~~(>_<)~~~~。

#include <stdio.h>#include <stdlib.h>#include <math.h>typedef struct _segment {double l, r;}segment;segment S[10005];int cmp(const void *a, const void *b){segment *p = (segment *)a;segment *q = (segment *)b;if (p-> l < q->l) {return -1;}else {return 1;}}int main(){int n, w, l, s, r;while (~scanf("%d%d%d",&n,&l,&w)) {int size = 0;for (int i = 0; i < n; ++ i) {scanf("%d%d",&s,&r);if (2*r > w) { // 用平方溢出了 - - S[size].l = s - sqrt(1.0*r*r - 0.25*w*w);S[size].r = s + sqrt(1.0*r*r - 0.25*w*w);size ++;}}qsort(S, size, sizeof(segment), cmp);int index = 0, now = 0, count = 0;double l_bound = 0, r_bound = 0;while (l_bound < l && now < size) {index = now;while (S[index].l <= l_bound && index < size) {if (r_bound < S[index].r) {r_bound = S[index].r;}index ++;}if (index == now) {break;}else {count ++;now = index;l_bound = r_bound;}}if (S[0].l > 0 || l_bound < l) {printf("-1\n");}else {printf("%d\n",count);}}    return 0;}