poj 3485 区间选点

本文解决了一个经典的算法问题——如何在一条长度为L的公路上,依据一系列村庄的位置,确定最少需要建设多少个出口使得每个村庄到最近出口的距离不超过给定值D。通过构造区间并采用贪心算法进行求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=3485

题意:X轴上公路从0到L,X轴上下有一些点给出坐标代表村庄,问在公路上最少建几个出口才能使每个村庄到出口的距离不超过D。

以村庄为圆心,半径为 d 画圆,与公路相交,得到一个一个区间,这么选点呢?

按照区间右端点排序,第一个点,选择第一条线段的右端点,当前位置就在这里,已经(很)靠后了,拿这个点去查看以后的线段,看是不是符合。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 10005;
 8 
 9 struct Point
10 {
11     double x,y;
12 } points[maxn];
13 
14 struct Line
15 {
16     double x,y;
17 } lines[maxn];
18 
19 bool cmp(Line a,Line b)
20 {
21     return a.y < b.y;
22 }
23 
24 int main()
25 {
26     double s;
27     double d;
28     while(~scanf("%lf%lf",&s,&d))
29     {
30         int n;
31         scanf("%d",&n);
32         for(int i=0; i<n; i++)
33         {
34             scanf("%lf%lf",&points[i].x,&points[i].y);
35             lines[i].x = points[i].x - sqrt(d*d-points[i].y*points[i].y);
36             lines[i].y = points[i].x + sqrt(d*d-points[i].y*points[i].y);
37         }
38 
39         sort(lines,lines+n,cmp);
40         int ans = 1;
41         double cur = lines[0].y;
42         for(int i=1; i<n; i++)
43         {
44             if(cur>=lines[i].x&&cur<=lines[i].y)
45                 continue;
46             else
47             {
48                 cur = lines[i].y;
49                 ans++;
50             }
51         }
52 
53         printf("%d\n",ans);
54     }
55     return 0;
56 }
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/6636667.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值