您的位置:首页 > 其它

UVa 10382 - Watering Grass

2017-07-20 16:31 260 查看
题目:有一块矩形草坪,在中线上有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: