UVA 10382 - Watering Grass

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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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;
}




你可能感兴趣的:(ACM)