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

算法提高篇基础算法第一章 - 贪心算法

1422:【例题1】活动安排

这是一个经典的活动选择问题,可以使用贪心算法来解决。我们可以按照活动的结束时间对活动进行排序,然后从最早结束的活动开始选择,不断更新当前可选活动的起始时间,直到所有活动都被考虑过。

下面是使用C++实现的解答:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 定义活动结构体
struct Activity {int start;int end;
};// 按照活动结束时间排序
bool cmp(Activity a, Activity b) {return a.end < b.end;
}int main() {int n;cin >> n;vector<Activity> activities(n);for (int i = 0; i < n; i++) {cin >> activities[i].start >> activities[i].end;}// 按照活动结束时间排序sort(activities.begin(), activities.end(), cmp);int count = 1;  // 选择的活动数量,至少可以选择第一个活动int lastEnd = activities[0].end;  // 上一个选择的活动的结束时间for (int i = 1; i < n; i++) {if (activities[i].start >= lastEnd) {count++;lastEnd = activities[i].end;}}cout << count << endl;return 0;
}

解释:

  1. 我们首先定义了一个Activity结构体,包含活动的起始时间start和结束时间end

  2. 然后定义了一个比较函数cmp,用于按照活动的结束时间对活动进行排序。

  3. 在主函数中,我们读取活动的数量n,然后读取每个活动的起始时间和结束时间,并存储到activities向量中。

  4. 接下来,我们使用sort函数对activities向量进行排序,按照活动的结束时间从小到大排序。

  5. 我们初始化count变量为1,表示至少可以选择第一个活动,同时将lastEnd变量初始化为第一个活动的结束时间。

  6. 然后,我们从第二个活动开始遍历activities向量,对于每个活动,如果它的起始时间大于等于lastEnd,说明它与上一个选择的活动不冲突,可以选择该活动,并更新countlastEnd变量。

  7. 最后,我们输出选择的活动数量count

该解答的时间复杂度为O(nlogn),主要是由于排序操作。空间复杂度为O(n),用于存储活动的向量。

1423:【例题2】种树

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;struct tree{int B;int E;int T;
};bool cmp(tree a, tree b){return a.E < b.E;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n, m, ans = 0;cin >> n >> m;vector<tree> a(m + 1);for (int i = 1; i <= m; i++){cin >> a[i].B >> a[i].E >> a[i].T; }sort(a.begin(), a.end(), cmp);vector<bool> f(n, false);for (int i = 1; i <= m; i++){int k = 0;for (int j = a[i].B; j <= a[i].E; j++){if (f[j]) k++;}if (k >= a[i].T) {continue;} else {for (int l = a[i].E; l >= a[i].B; l--){if (!f[l]) {k++;f[l] = true;if (k >= a[i].T) break;}}}}for (int i = 1; i <= n; i++){if (f[i]) ans++;}cout << ans << endl;return 0;
}

1424:【例题3】喷水装置

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;// 喷头结构
struct Sprinkler {double left, right; // 喷头覆盖的左右端点
};// 按照左端点排序喷头
bool compareSprinkler(const Sprinkler &a, const Sprinkler &b) {return a.left < b.left;
}int main() {int T; // 测试数据组数cin >> T;while (T--) {int n, L, W;cin >> n >> L >> W;vector<Sprinkler> sprinklers;for (int i = 0; i < n; ++i) {int position, radius;cin >> position >> radius;double width = (double)W / 2;// 计算喷头能覆盖的最左和最右的位置if (radius > width) {double reach = sqrt(radius*radius - width*width);sprinklers.push_back({(double)position - reach, (double)position + reach});}}// 按左端点排序sort(sprinklers.begin(), sprinklers.end(), compareSprinkler);double covered = 0; // 已覆盖的长度int count = 0; // 需要的喷头数量int i = 0; // 当前遍历到的喷头索引bool failed = false; // 是否失败while (covered < L) {double maxCover = covered;// 寻找能覆盖当前未被浇灌区域最远的喷头while (i < n && sprinklers[i].left <= covered) {maxCover = max(maxCover, sprinklers[i].right);i++;}if (maxCover <= covered) { // 如果没有进展,则表示无法继续覆盖failed = true;break;}// 更新已覆盖的区域和喷头计数covered = maxCover;count++;}if (failed) {cout << -1 << endl; // 如果无法覆盖整个草坪,则输出-1} else {cout << count << endl; // 否则,输出需要的最少喷头数量}}return 0;
}

相关文章:

  • 乡村数字化转型:科技赋能打造智慧农村新生态
  • JAVA面试大全之数据库篇
  • 无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写
  • Mistral 7B v0.2 基础模型开源,大模型微调实践来了
  • Linux网络配置(超详细)
  • 本地项目上传到GitHub
  • leetcode283-Move Zeroes
  • vue实现相机拍摄,可录视频、拍照片、前置后置切换(简单小demo)
  • Redis的Hash数据结构中100万对field和value,field是自增时如何优化?优化Hash结构。
  • Git 核心知识
  • idea从零开发Android 安卓 (超详细)
  • 算法系列--动态规划--特殊的状态表示--分析重复子问题
  • python opencv之提取轮廓并拟合圆
  • 智慧公厕,为智慧城市建设注入了新的活力
  • 杰理芯片AC79——物联网远程点亮/关闭LED灯
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【5+】跨webview多页面 触发事件(二)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • express.js的介绍及使用
  • HTTP那些事
  • JavaScript学习总结——原型
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS 面试题总结
  • nodejs调试方法
  • Python打包系统简单入门
  • quasar-framework cnodejs社区
  • 初识 beanstalkd
  • 从伪并行的 Python 多线程说起
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端临床手札——文件上传
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 用Canvas画一棵二叉树
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​ubuntu下安装kvm虚拟机
  • #AngularJS#$sce.trustAsResourceUrl
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • ${factoryList }后面有空格不影响
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (26)4.7 字符函数和字符串函数
  • (6)设计一个TimeMap
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)JAVA使用POI操作excel
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)c52学习之旅-独立按键
  • (未解决)macOS matplotlib 中文是方框
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)EXC_BREAKPOINT僵尸错误
  • ***利用Ms05002溢出找“肉鸡
  • .net Application的目录
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net 托管代码与非托管代码