撒水

撒水

 

Problem Description

大夏天又来了,草坪的小草都被晒枯萎了,LOL(人名)希望买些撒水的装置放在草坪上,LOL的草坪是个长方形,长为w米,宽为h米,要在中线上不同的位置放置喷洒半径为Ri的喷水装置,这样就能喷洒直径为2*Ri(0<Ri<15)的圆,LOL手里有充足的装置x(1<x<10000)个,由于位置是固定了,所以不一定能喷洒整个草坪,如果可以的话他希望用最少的装置来喷洒整个草坪,10个以内自己能搞定,多了就糊涂了,所以请你这个ACMer来帮他完成。

Input

第一行输入一个正整数N(1 <= 20 )表示共有n次测试数据。
每一组测试数据的第一行有三个整数n, w, h,n表示共有n个喷水装置,w为草坪长度,h为草坪宽度。
接下来的n行,都有两个整数x 和r ,x表示第i个喷水装置的的横坐标(最左边为0),r表示该喷水装置能喷洒的圆的半径.

Output

每组测试数据输出一个正整数,表示共需要多少个喷水装置。
如果不存在一种能够把整个草坪湿润的方案,请输出0。

Sample Input

2
2 6
1 1
4 5
2 10 6
4 5
6 5

Sample Output

1
2

解释:

之前做过一个类似的题目,所以知道解决的办法。以前好像是一个卫星有关的题目,从想要覆盖整个X轴,要求最下的卫星数。这个题目很像。

首先每一个洒水器画一个圆,如果这个洒水不能喷到草坪的上边,那么这个洒水就肯定是没有用的。如果可以喷到上边,就会有一个截距,有两个交点(lx, rx)。因此对于每一个洒水器,我按照lx,最小的优先,lx相等的时候,rx最大优先排序。首先判断最小的一个lx 是不是小于0,最大一个rx是不是大于w. 然后对于长边的每一个点,判断是不是有洒水器可以覆盖。 如果有一个不满足,直接输出0.

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int N = 10001;
 6 
 7 struct spray{
 8   double lx, rx;
 9 };
10 
11 struct spray sprays[N];
12 
13 int cmp(spray a, spray b) {
14   if (abs(a.lx - b.lx) < 0.00001) {
15     return a.rx > b.rx;
16   } else {
17     return a.lx < b.lx;
18   }
19 }
20 
21 
22 int main() {
23   int t;
24   scanf("%d", &t);
25   while (t--) {
26     int n, s = 0;
27     double w, h;
28     scanf("%d %lf %lf", &n, &w, &h);
29     double x, r;
30     for (int i = 0; i < n; i++) {
31       scanf("%lf %lf", &x, &r);
32       if (r >= h/2) {
33          sprays[s].lx = double(x - sqrt(r * r - (h / 2) * (h / 2)));
34          sprays[s].rx = double(x + sqrt(r * r - (h / 2) * (h / 2)));
35          s++;
36       }
37      
38     }
39     sort(sprays, sprays+s, cmp);
40     double lx = 0, rx = 0.0;
41    
42     if (sprays[0].lx > 0.0 || sprays[s-1].rx < w || s == 0) printf("0
");
43     else {
44       int sums = 0, i = 0; 
45       double max_rx = 0;
46       while (rx < w && i < s) {
47         max_rx = 0;
48         while (sprays[i].lx <= rx && i < s && max_rx < w) {
49           if (max_rx <= sprays[i].rx) {
50             max_rx = sprays[i].rx;
51           }
52           i++;
53         }
54         if (abs(max_rx - 0) < 0.00001) {
55           sums = 0;
56           break;
57         }
58         rx  = max_rx;
59         sums++;
60       }
61       printf("%d
", sums);
62     }
63   }
64   return 0;
65 }
View Code

这个图画的,很阳光,很帅气。(其实chou的一批)

原文地址:https://www.cnblogs.com/gznb/p/11208337.html