【贪心算法】 藏匿的刺客(C/C++)

简介: 【贪心算法】 藏匿的刺客(C/C++)

贪心算法(Greedy Algorithm) 概述:

贪心算法是一种在求解最优化问题时采取的一种常用算法策略。贪心算法的基本思想是,每次选择当前情况下的局部最优解,并相信这个局部最优解能够导致全局最优解。贪心算法通过迭代的方式一步步地构建最优解,并不进行回溯。

贪心算法的一般步骤:

1. 将问题分解成多个子问题;

2. 对每个子问题,确定一个最优解;

3. 对每个子问题的最优解进行合并,得到原问题的最优解。

贪心算法的正确性需要满足两个条件:

1.最优子结构:问题的最优解能够由子问题的最优解组合而成。

2. 贪心选择性:通过局部最优选择能够得到全局最优解。


贪心算法的特点包括:

1. 局部最优:在每一步选择中都采取当前状态下最好或最优的选择。

2. 无后效性:一旦做出选择,此选择就不再改变。

3. 贪心选择性质:一个问题的最优解包含其子问题的最优解。

4. 最优子结构:一个问题的最优解可以通过其子问题的最优解来获得。

贪心算法适用于解决一些特定问题,如:

- 图论中的最短路径问题:如Dijkstra算法和Bellman-Ford算法。

- 最小生成树问题:如Kruskal算法和Prim算法。

- 调度问题:如区间调度问题。

- 压缩编码:如霍夫曼编码。

贪心算法的步骤通常包括:

1. 建立数学模型:定义决策变量、目标函数和约束条件。

2. 寻找贪心选择性质:确定每一步的贪心选择策略。

3. 证明贪心选择的正确性:通过数学归纳法或其他方法证明贪心选择最终能得到问题的最优解。

4. 算法实现:根据贪心选择性质编写算法代码。

需要注意的是,贪心算法并不总是能得到问题的最优解,它适用于那些具有贪心选择性质的问题。在没有贪心选择性质的问题上,贪心算法可能只能得到近似解。


由于贪心是一种思想,没有具体的算法模板,而且贪心一般不会单独作为一种算法出现在题目中,一般会跟其他算法结合在一起出现。例如:动态规划、递归、高级数据结构等。在此基础上保证每一步时最优解的情况下就可以得到最优的答案。下面我们将以例题的形式让大家来了解这种思想。


资源限制


内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s


问题描述


 强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。

 kAc帝国防守森严,鹏带领着小伙伴们躲在城外的草堆叶子中,称为叶子鹏。

 kAc帝国的派出的n个看守员都发现了这一问题,第i个人会告诉你在第li个草堆到第ri个草堆里面有人,要求你计算所有草堆中最少的人数,以商议应对。

 “你为什么这么厉害”,得到过kAc衷心赞美的你必将全力以赴。


输入格式


 第一行一个数字n,接下来2到n+1行,每行两个数li和ri,如题。


输出格式


 输出一个数,表示最少人数。


样例输入


5

2 4

1 3

5 7

1 8

8 8


样例输出


3


数据规模和约定


 30%的数据n<=10

 70%的数据n<=100

 100%的数据n<=1000

 所有数字均在int表示范围内

贪心算法引入:

这道题是要求得最小的人数,题意类似于区间合并的问题,就是被这个区间被覆盖掉,所选的区间尽量包含士兵口中所说的更多的区间,那么我就要找一个标准,,一般选择一个区间的左端点。为了方便计算,那么我们先要进行排好序, 根据左端点的大小,由小到大排序。排完之后我们就可以以左端点为标准,去查看右端点的情况,如果有右端点不在这个范围里了,那么更新左端点的标准,在这个区间再加上一个人,继续更新,一次类推。

#include<stdio.h>
int sum;//最少人数
int a[1005][2];//a[i][0]表示左端点,a[i][1]表示右端点
int vis[1005];//标记数组,若能分层成一组则置为1,最后统计1的个数
int main() {
  int i, j, x,n;
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%d%d", &a[i][0], &a[i][1]);//输入左端点与右端点
  }
  for (i = 0; i < n - 1; i++) {//冒泡排序以右端点为基准(也可以左端点),对每组左右端点排序
    for (j = 0; j < n-1-i; j++) {
      if (a[j][1] > a[j + 1][1]) {
        int tmp;
        tmp = a[j][1];
        a[j][1] = a[j + 1][1];
        a[j + 1][1] = tmp;
        tmp = a[j][0];
        a[j][0] = a[j + 1][0];
        a[j + 1][0] = tmp;
      }
    }
  }
  x = a[0][1];//初始值
  vis[0] = 1;//第一个li-ri必然有一个刺客
  for (i = 1; i < n; i++) {//对已经排序好的数组,只要i-1的右端点>i的左端点的就另起一个
    if (a[i][0] > x) {   //标记vis[i]=1;若i-1的右端点<i的左端点就共用一个刺客
      vis[i] = 1;      //不断更新x,保证刺客最少
      x = a[i][1];
    }
  }
  for (i = 0; i < n; i++) {//统计刺客个数
    if (vis[i] == 1) {
      sum++;
    }
  }
  printf("%d", sum);
  return 0;
}

本人小白一枚,若有不明白的地方,可私信博主,可一一解答;若有错误的地方,恳请大佬指出,共同进步。执笔至此,感触彼多,全文将至,落笔为终,感谢各位的支持。


相关文章
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
339 2
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
513 15
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
393 17
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
375 0
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
409 8
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
376 4
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
481 0
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
420 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。

热门文章

最新文章