当前位置: 首页 > ops >正文

最少标记点问题:贪心算法解析

最少标记点问题:贪心算法解析

问题描述

在一条直线上有n个点,其中第i个点的位置是Xi。我们需要从这些点中选择若干个进行标记。要求:

  1. 对于每一个点,在其距离R的范围内必须至少有一个被标记的点(如果点本身被标记,则认为满足条件)
  2. 在满足上述条件的情况下,尽可能减少被标记的点的数量

算法思路

这个问题可以使用贪心算法高效解决,基本思路如下:

  1. 排序:首先将所有点按照位置从小到大排序
  2. 覆盖:从最左边的点开始,找到最远的能被当前标记点覆盖的点
  3. 标记:在覆盖范围的边界处放置标记点
  4. 重复:移动到下一个未被覆盖的点,重复上述过程

代码实现

#include <iostream>
#include <algorithm>
using namespace std;#define MAX_N 1000int N, R;
int X[MAX_N] = {1, 7, 15, 20, 30, 50};void solve() {// 首先对点进行排序sort(X, X + N);int i = 0;          // 当前处理的点的索引int marked_count = 0; // 被标记的点的数量while (i < N) {// 当前未覆盖区域的最左点int leftmost_uncovered = X[i];// 向右移动,找到第一个不能被leftmost_uncovered + R覆盖的点while (i < N && X[i] <= leftmost_uncovered + R) {i++;}// 标记点是在上一个点(即X[i-1])int marked_point = X[i - 1];marked_count++;// 跳过所有能被当前标记点覆盖的点while (i < N && X[i] <= marked_point + R) {i++;}}cout << "最少需要标记的点数量: " << marked_count << endl;
}int main() {N = 6;  // 点的数量R = 10; // 覆盖半径solve();return 0;
}

算法解析

让我们用示例数据 X = {1, 7, 15, 20, 30, 50}R = 10 来逐步分析算法:

  1. 初始状态:排序后数组不变,i=0
  2. 第一轮
    • leftmost_uncovered = 1
    • 找到第一个超过1+10=11的点:15(i=2)
    • 标记点选择X[1]=7
    • 跳过所有能被7+10=17覆盖的点:跳过15(i=3),20超过17停止
    • 标记计数=1
  3. 第二轮
    • leftmost_uncovered = 20
    • 找到第一个超过20+10=30的点:30(i=4)实际上30=30,所以继续到50(i=5)
    • 标记点选择X[4]=30
    • 跳过所有能被30+10=40覆盖的点:50超过40停止
    • 标记计数=2
  4. 第三轮
    • leftmost_uncovered = 50
    • 没有更多点,标记点选择X[5]=50
    • 标记计数=3

最终结果为3个标记点(7,30,50)

复杂度分析

  • 时间复杂度:O(N log N),主要由排序步骤决定
  • 空间复杂度:O(1),只使用了常数个额外空间

实际应用

这种贪心算法可以应用于许多实际问题,如:

  • 无线基站部署问题
  • 监控摄像头布置
  • 路灯安装规划

通过这种策略,我们可以在满足覆盖要求的前提下,最小化资源的使用量。

http://www.xdnf.cn/news/15729.html

相关文章:

  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Java机考题:815. 公交路线 图论BFS
  • 消息队列与信号量:System V 进程间通信的基础
  • P1816 忠诚 题解
  • Flutter基础(前端教程①④-data.map和assignAll和fromJson和toList)
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • 立创EDA中双层PCB叠层分析
  • 锂电池生产过程图解
  • 【OD机试】停车场收费
  • 暑假训练七
  • 【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致
  • Three.js与AIGC的化学反应:AI生成3D模型在实时渲染中的优化方案
  • Weavefox 图片 1 比 1 生成前端源代码
  • 基于Electron打包jar成Windows应用程序
  • LangGraph教程6:LangGraph工作流人机交互
  • [MySQL基础3] 数据控制语言DCL和MySQL中的常用函数
  • 基于Socket来构建无界数据流并通过Flink框架进行处理
  • 软考 系统架构设计师系列知识点之杂项集萃(112)
  • 根据ARM手册,分析ARM架构中,原子操作的软硬件实现的底层原理
  • LeetCode|Day19|14. 最长公共前缀|Python刷题笔记
  • 财务术语日常学习:存货跌价准备
  • scalelsd 笔记 线段识别 本地部署 模型架构
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-133节(SQL——DQL——基础查询)
  • 云服务器搭建自己的FRP服务。为什么客户端的项目需要用Docker启动,服务端才能够访问到?
  • Leetcode 05 java
  • 动态规划算法的欢乐密码(三):简单多状态DP问题(上)
  • 微信小程序171~180
  • MySQL详解二