POJ_3069 Saruman's Army 【贪心】

本文深入解析了POJ3069题目,通过贪心算法解决了一维坐标中设置最少监测点的问题,确保所有点都被监测到。文章详细介绍了算法步骤,并附带AC代码。

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

一、题面

POJ3069

二、题意分析

我的理解是,可以在每个点设置一个监测点,能够监测到范围R内的所有其他点,那么问给出N个点的一维位置,需要在其中挑多少个监测点把所有点都监测到。

贪心解决:

  1.先排序。

  2.考虑第一个点,因为每个点是必须要监测的,那么第一个点需要被监测到,它可以是监测点,也可以是被监测点。贪心的想,为了能监测更多的点,让第一个点作为被监测的点,且是监测范围内最边界上的点。

  3.现在需要考虑,当第一个点往右探测R范围时,最后一个点将是需要设置的监测点。

  4.以这个监测点再往右扫R范围。

  5.完成了一个监测点及其范围内点的覆盖。后面的点类似处理。

 

三、AC代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int MAXN = 1e3;
 8 int Data[MAXN+3], N, R;
 9 
10 int solve()
11 {
12     int i = 0, ans = 0, cur;
13     while(i < N)
14     {
15         cur = Data[i++];
16         while(i < N && Data[i] <= cur+R)
17             i++;
18         cur = Data[i-1];
19         while(i < N && Data[i] <= cur + R)
20             i++;
21         ans++;
22     }
23     return ans;
24 }
25 
26 int main()
27 {
28     freopen("input.txt", "r", stdin);
29     while(scanf("%d %d", &R, &N) != EOF && R != -1)
30     {
31         for(int i = 0; i < N; i++)
32             scanf("%d", &Data[i]);
33         sort(Data, Data+N);
34         printf("%d\n", solve() );
35     }
36     return 0;
37 }
View Code

 

转载于:https://www.cnblogs.com/dybala21/p/10105670.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值