活动选择与小船过河问题(贪心算法)
活动选择问题描述:
存在一个教室,有下面若干个活动需要安排在一天进行,活动之间不能重叠,如何安排活动使活动的数量最多?
活动序号 1 2 3 4 5 6 7 8 9 10 11 (活动已经按结束时间排好)
开始时间 1 3 0 5 3 5 6 8 8 2 12
结束时间 4 5 6 7 9 9 1011 12 14 16
贪心解题思路:
贪心的核心在于局部最优解,在本题中,要想使活动数量最多,最优解即选择结束时间最早的活动,预留出了最大的空间给后面的活动来进行所以我们首先把活动按结束时间来进行排序,这样省去了寻找的麻烦,方便了查找。
因为活动已经按照结束时间排序,按照选择结束时间最早活动,所以第一个活动选择编号为1的活动,为了方便代码的实现,所以加了序号为0的活动。
活动选择贪心代码实现:
#define NUM 11 //活动数量//活动开始时间数组
int start[NUM + 1] = { 0,1,3,0,5,3,5,6,8,8,2,12 };
//活动结束时间数组
int end[NUM + 1] = { 0,4,5,6,7,9,9,10,11,12,14,16 };//活动选择问题
vector<int> ActivitySelectorActivity(int *s, int *e)
{int i = 1, j;vector<int> resV; //用于存储结果resV.push_back(1); //默认把结束时间最早的活动加入最终结果,活动时间已经排好,所以默认把1加入for (j = 2; j <= NUM + 1; j++){if (s[j] >= e[i]){resV.push_back(j); //把下一个最早结束的活动加入结果i = j; //比较对象改成排在最后的活动}}return resV;
}//打印结果
void OutputResult(vector<int> resV)
{int i;for (i = 0; i != resV.size(); ++i){cout << resV[i] << "\t";}cout << endl;
}
时间复杂度:
排除排序活动的时间不谈,活动选择主函数中进行了一层循环,所以时间复杂度为O(n)。
小船过河问题描述:
有若干人需要过河,只有一条船,每个人划船的耗时不同,每次两个人划船,耗时为两人中较长的一个的,划船过去后需要人划船回来,问如何设计让所有人过河且耗时最短?
贪心解题思路:
假设存在最少4个人abcd需要渡河,耗时a<b<c<d,这时就有两种最快方案:
(1)让a,b先渡河,a回来并担当船夫不断拉c和d过河,这样船划回来的时间最短,耗时为2*a[0]+a[n-2]+a[n-1]
(2)让a,b先渡河,a回来,然后c,d渡河,然后c回来,最后一起渡河,耗时为a[0]+2*a[1]+a[n-1]
两种情况的优劣取决于abcd的耗时,所以本题就分解为局部求最优解。
小船过河代码实现:
int a[1000]; //人数N的范围为1<=N<=1000,数组a表示人的集合//小船过河(贪心)
int CrossRiver(int t,int num)
{int sum = 0; //渡河总时间int n = num; //渡河总人数while (t--) //共几组人{for (int i = 0; i < n; i++){cin >> a[i]; //输入每个人渡河时间}//每四个人局部计算最优解while (n>3){sum += min(a[1] + a[0] + a[n - 1] + a[1], a[n - 1] + a[0] + a[n - 2] + a[0]);n -= 2;}if (n==3){sum += a[0] + a[1] + a[2];}else if (n == 2){sum += a[1];}else{sum += a[0];}return sum;}
}
活动选择与小船过河问题(贪心算法)相关推荐
- 从 活动选择问题 看动态规划和贪心算法的区别与联系
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 小船过河(贪心算法)
题目 只有一艘船,最多能乘2人,船的运行速度为2人中较慢一人的速度,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久. 输入: 4 1 2 5 10 输出: 17 思考 1.因为考虑到需要 ...
- 活动安排问题的 动态规划和贪心算法
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 【算法设计与分析】活动安排问题(动态规划和贪心算法)
一.活动选择问题描述 假设我们存在这样一个活动集合S={a1,a2,a3,a4,...,an},其中每一个活动ai都有一个开始时间si和结束时间fi保证(0≤si<fi),活动ai进行时,那么它 ...
- 农夫过河——python贪心算法实现
1.问题描述: 一个农夫在河的西岸带了一匹狼.一只羊和一棵白菜,他需要把这三样东西用船带到河的东岸.然而,这艘船只能容下农夫本人和另外一样东西.如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜. 2.问 ...
- 【转】小船过河问题(贪心)
转载自:https://www.cnblogs.com/ALL-pp/p/6204138.html 题意: N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同t[i],每次过河的时间为船上的 ...
- 贪心算法之活动选择问题
贪心算法之活动选择问题 我们在之前的文章里面已经提到过动态规划的方法来求解最优的问题,但是就是因为动态规划太过于强大,像一把瑞士军刀,在一些比较特殊的问题上再使用动态规划的话,就有点用脸盆刷牙的感觉了 ...
- 贪心算法-活动安排问题
贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到 ...
- 活动安排问题 动态规划、贪心算法C语言实现
问题描述 设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束 ...
最新文章
- 微软输入法TSF SampleIME 代码浅说
- 光猫直连电脑不能上网_电脑不能上网怎么办?DNS解析失败的解决方法
- SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户
- 玩转NumPy——split()函数使用详解
- impala sql清单
- python except用法和作用_Python面试题(部分附带面试标准答案) 建议收藏
- [深度学习-实践]条件生成对抗网络cGAN的例子-Tensorflow2.x Keras
- CV Code | 本周计算机视觉新出开源代码汇总(含医学图像分割、神经架构搜索、姿态迁移、超分辨率等)...
- HTML 图片加载问题
- 检查PHP扩展是否安装成功
- ubuntu添加windows字体
- 数论入门整理(updating)
- 将ASM里面的文件copy到文件系统
- ZYF loves binary(dp)
- jsp酒店客房预订系统带前端
- 利用XrecycleView写多条目展示+流式布局
- 设置docker容器时间
- 斗地主机器人智能算法深度研究
- 每周全球科技十大新闻(2021.1.18-1.24)
- 《Flutter 控件大全》第八个:AnimatedCrossFade
热门文章
- 斐波纳契数列。递归和非递归分别实现求第n个斐波那契数。(从第3项开始每1项的值为前两项的和)
- 一大堆模块的结晶……
- 科技的成就(三十六)
- 代价高昂的免费机器人课程{人工智能与机器人教育之个人感悟}
- linux 实时监控系统IO状态和IO性能
- web课程设计网页规划与设计:旅游网页主题网站设计——酒店主题绿色温泉度假酒店网页设计(8页)HTML+CSS+JavaScript
- Hazel引擎学习(四)
- ural 1671 Anansi's Cobweb
- 回车符号和换行符号产生背景
- ruoyi-ui下载依赖报错npm ERR! cb() never called!