您的位置:首页 > 其它

UVA 10382 - Watering Grass

2013-11-11 22:43 260 查看
Watering Grass

Input:
standard input

Output: standard output

Time Limit: 3 seconds

n sprinklers areinstalled in a horizontal strip of grass l meters long andwmeters wide. Each sprinkler is installed at the horizontal center line of thestrip. For each sprinkler we are given its position as the distance from theleft
end of the center line and its radius of operation.

What is the minimum number of sprinklers to turnon in order to water the entire strip of grass?



Input

Input consists of a number ofcases. The first line for each case contains integer numbersn,
land w with n <= 10000. The next n lines containtwo integers giving the position of a sprinkler and its radius of operation.(The picture above illustrates the first case from the sample input.)

Output

For each test case output the minimum number of sprinklers needed to waterthe entire strip of grass. If it is impossible to water the entire strip output-1.

Sample input

8 20 2

5 3

4 1

1 2

7 2

10 2

13 3

16 2

19 4

3 10 1

3 5

9 3

6 1

3 10 1

5 3

1 1

9 1

Sample Output

6

2

-1

(Regionals 2002 Warm-up Contest, Problem setter: Piotr Rudnicku)

贪心,主要就是精度问题。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <queue>
#include <set>

using namespace std;

#ifdef WIN
typedef __int64 LL;
#define form "%I64d\n"
#else
typedef long long LL;
#define form "%lld\n"
#endif

#define SI(a) scanf("%d", &(a))
#define SDI(a, b) scanf("%d%d", &(a), &(b))
#define S64I(a) scanf(form, &a)
#define SS(a) scanf("%s", (a))
#define SDS(a, b) scanf("%s%s", (a), (b))
#define SC(a) scanf("%c", &(a))
#define PI(a) printf("%d\n", a)
#define PS(a) puts(a)
#define P64I(a) printf(form, a)
#define Max(a, b) (a > b ? a : b)
#define Min(a, b) (a < b ? a : b)
#define MSET(a, b) (memset(a, b, sizeof(a)))
#define Mid(L, R) (L + (R - L)/2)
#define Abs(a) (a > 0 ? a : -a)
#define REP(i, n) for(int i=0; i < (n); i++)
#define FOR(i, a, n) for(int i=(a); i <= (n); i++)
const int INF = 0x3f3f3f3f;
const double eps = 10e-9;

const int maxn = 10000 + 50;

typedef struct Node {
double l, r;
bool operator < (const Node & b) const {
return l < b.l;
}
} Node;

Node Water[maxn];

int main() {
int n, L;
double w;

while(scanf("%d%d%lf", &n, &L, &w) == 3) {
int nn = 0;
REP(i, n) {
int x, y;
scanf("%d%d", &x, &y);
if(x < 0 || x > L || (w-y*2.0 > -eps)) continue;
double l, r;
l = (double)x - sqrt((double)y*y-(w*w/4.0));
r = (double)x + sqrt((double)y*y-(w*w/4.0));
Water[nn].l = l;
Water[nn].r = r;
nn++;
}
n = nn;
sort(Water, Water+n);
double y=0;
int ans = 0;
while(L-y > eps) {
double my = 0;
int myi = 0;
int i=0;
while(i < n && y - Water[i].l > -eps) {
if(Water[i].r > my) {
my = Water[i].r;
myi = i;
}
i++;
}
if(y-my > -eps) {
break;
}
y = my;
ans ++;
}
if(L-y > eps) {
puts("-1");
} else {
PI(ans);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: