Watering Grass (贪心,最小覆盖)

参考:  

https://blog.csdn.net/shuangde800/article/details/7828675

https://www.cnblogs.com/haoabcd2010/p/6171794.html?utm_source=itdadao&utm_medium=referral

 

 

 

 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 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/11120490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值