0
点赞
收藏
分享

微信扫一扫

Watering Grass (贪心,最小覆盖)

独西楼Q 2022-06-02 阅读 36

参考:  

Watering Grass (贪心,最小覆盖)_ios

 

Watering Grass (贪心,最小覆盖)_ide_02

 

1 #include <iostream>
2 #include <stdio.h>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6
7
8 using namespace std;
9
10 struct node
11 {
12 double L;
13 double R;
14 }a[10010];
15
16 bool cmp(node a, node b)
17 {
18 return a.R > b.R;
19 }
20
21 void sort_node(int n)
22 {
23 for (int i=0;i<n;i++)
24 {
25 int k=i;
26 for (int j=i+1;j<n;j++)
27 {
28 if (a[j].R>a[k].R)
29 k=j;
30 }
31 swap(a[k],a[i]);
32 }
33 }
34
35 int main()
36 {
37 int n;
38 double length, wide;    // 都定义为double类型,因为使用勾股定理的时候肯定会算出小数
39 double center, radius; // center为圆心,radius为半径
40 double t;
41 while(scanf("%d%lf%lf", &n, &length, &wide) != EOF)
42 {
43 for(int i = 0; i < n; ++i)
44 {
45 cin >> center >> radius;
46 t = sqrt(radius*radius - (wide/2.0)*(wide/2.0));
47 a[i].L = center - t;
48 a[i].R = center + t;
49 }
50
51 //sort(a, a+n, cmp); 快排不知道为什么不能AC
52 sort_node(n);
53
54 double border = 0;
55 int cnt = 0;
56 while(border < length)  // 此类型题目的固定套路
57 {
58 int i;
59 for(i = 0; i < n; ++i)
60 {
61 if(a[i].L <= border && a[i].R > border)
62 {
63 border = a[i].R;
64 cnt++;
65 break;
66 }
67 }
68
69 if(i == n) // 如果i==n,说明遍历完了这n个区间,仍然没有找到符合条件的,即不能完全覆盖
70 break;
71 }
72
73 if(border < length)
74 cout << -1 << endl;
75 else
76 cout << cnt << endl;
77 }
78
79 return 0;
80 }

 


举报

相关推荐

0 条评论