LOJ#10002. 「一本通 1.1 例 3」喷水装置

你说的曾经没有我的故事 提交于 2020-05-05 21:47:41

#10002. 「一本通 1.1 例 3」喷水装置

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: 1bentong

题目描述

LLL 米,宽 WWW 米的草坪里装有 nnn 个浇灌喷头。每个喷头都装在草坪中心线上(离两边各 W2\frac{W}{2}2W​​ 米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。

请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?

Picture1

输入格式

输入包含若干组测试数据。

第一行一个整数 TTT 表示数据组数;

每组数据的第一行是整数 nnn、LLL 和 WWW;

接下来的 nnn 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。

输出格式

对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出 −1-11 。

样例

样例输入

3
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

样例输出

6
2
-1

数据范围与提示

对于 100%100\%100% 的数据,n≤15000n \le 15000n15000

 

细节决定成败

 

 1 //2018-07-27 22:23:33
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <cstring>
 7 using std::sort;
 8 
 9 typedef long long ll;
10 const int N = 15000001;
11 long long T; 
12 long long L, W, n;
13 struct node{
14     double st, ed;
15 }a[N];
16 bool cmp(node a, node b){
17     return a.st < b.st;
18 }
19 
20 inline long long read () {
21     ll val = 0, flag = 1;
22     char ch = getchar();
23     while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
24     while(ch == '-') flag = -flag, ch = getchar();
25     while(ch >= '0' && ch <= '9')
26         val = ((val << 1) + (val << 3) + ch - '0'), ch = getchar();
27     return val * flag;
28 }
29 
30 int main(){
31     T = read();
32     while(T--){
33         //
34         long long cnt = 0;
35         n = read(); L = read(); W = read();
36         for(long long i=1, pos, r; i<=n; i++){
37             pos = read(); r = read();
38             if(r <= W/2) continue; //sfjlsfdsdlfjds 
39             a[++cnt].st = pos - sqrt(r*r - W*W/4.0);
40             a[cnt].ed = pos + sqrt(r*r - W*W/4.0); 
41         }
42         sort(a+1, a+cnt+1, cmp);
43         //
44         double s = 0;
45         long long i = 1, ans = 0;
46         bool mark = true;
47         while(s < L){
48             ++ans;
49             double tmp = s;
50             for(;a[i].st<=tmp && i<=cnt; ++i)
51                 if(s < a[i].ed) s = a[i].ed;
52             if(s==tmp && tmp < L){
53                 puts("-1");
54                 mark = false;
55                 break;
56             }
57             
58         }
59         if(mark) printf("%lld\n", ans);
60             
61     
62     }
63     return 0;
64 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!