贪心算法

贪心算法-过河问题 pojo1700

橙三吉。 提交于 2019-11-27 23:30:30
过桥问题: 黑夜,只有一只手电筒 A过桥需要1s B过桥需要3s C过桥需要5s D过桥需要8s E过桥需要12s 求最小过桥时间 贪心算法: 从最大的开始过去,最小的两个做为辅助。 假如左岸人数为2:两个人直接过去,不需要回来,代价 假如左岸人数为3:由 辅助,代价 假如左岸人数大于3:将左岸最大两个人送到右岸,可以有两种方案: image.png 综上,此时 tips: 记得每次j-2。 代码如下: package my; import java.util.Arrays; import java.util.Scanner; public class Poj1700渡河 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t=sc.nextInt(); for(int i=0;i<t;i++) { int n = sc.nextInt(); int[]speed=new int[n]; for(int j=0;j<n;j++) { speed[j]=sc.nextInt(); } Arrays.sort(speed); int ans=f(n,speed); System.out.println(ans); } } public static int f(int n

贪心算法

放肆的年华 提交于 2019-11-27 23:03:38
Problem1删数问题 题目描述: 给定一正整数n(n的位数小于240),现要删除数n中的s个数码,使其得到的新数最小,求这个最小数。 输入 输入有两行,第一行为整数n,第二行即为s 输出 输出一行,即最小的那个数 Problem2旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离i、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。 输入 输入第一行有5个数:D1,c,D2,P,N(前四个为实数,N为整数,N<=1000) 后面有N行,每行两个实数,分别表示对应的加油站离出发点的距离,与每升汽油的价格 输出 输出仅一行,即最少花费 Problem3线段覆盖 题目描述 给定数轴上的n条线段(n<100),每个线段有其端点ai、bi组成(-999<=ai<bi<=999),由于有些线段会相互覆盖,所以求出至少去掉多少条线段,才能使剩下的所有线段之间互相没有内部公共点(若只是端点重合,则不是内部公共点)。 输入 输入第一行为整数N,接下来有N行,分别描述每条线段 输出 输出第一行为最少删除的线段数s

常用算法之贪心算法

这一生的挚爱 提交于 2019-11-27 21:35:59
贪心算法 贪心算法简介:   贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。 贪心算法每一步必须满足一下条件: 1.建立数学模型来描述问题 2.把求解的问题分成若干个子问题 3.对每一子问题求解,得到子问题的局部最优解 4.把子问题对应的局部最优解合成原来整个问题的一个近似最优解 贪心算法正确性证明(转载from刘子韬) 这里主要是介绍一种证明贪心算法是最优的一种方法:Exchange Argument (不知道应该怎么翻译到中文,交换参数?感觉听起来挺别扭的,不像是一个方法的名字~o(╯□╰)o) Exchange Argument的主要的思想也就是 先假设 存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立。 下面来看一个更为formal的解释: 步骤: Step0: 给出贪心算法A的描述 Step1: 假设O是和A最相似(假设O和A的前k个步骤都相同,第k+1个开始不同,通常这个临界的元素最重要)的最优算法 Step2: [Key] 修改算法O(用Exchange Argument,交换A和O中的一个元素),得到新的算法O’ Step3: 证明O’

2019.08.18【NOIP?提高组】模拟 A 组 总结

纵然是瞬间 提交于 2019-11-27 18:47:10
考场: \(100 + 10 + 0 = 110\) T1: 看到 \(m\) 那么大,于是就想到了矩乘。 但发现好像不行,于是打了个大大的贪心。 对拍跑了 \(30+\) 分钟一点都没错,于是自信满满地交了,果真 \(AC\) 。 T2: 考场先想到 \(O(nlog^2n)\) 的线段树,发现过不了。于是开始“异想天开”。 最后神奇想到分块。 赛后同学说分块是 \(O(m根号n)\) 的,我才发现时间好像过不了。。。 但我好像没有一个点 \(TLE\) 。。。 不停改细节最后成功 \(AC\) , \(700+ms\) 没有卡线。 分块打法好! T3: 积性函数? 总结: 对于一个算法,首先要考虑时间复杂度。 然后看看实现复杂度。(别到时候码不出来) 对于那些正确性不太显然的算法,一定要小心验证一下。 对了,还有空间别超了。 现在: \(100 + 100 + 0 = 200\) 来源: https://www.cnblogs.com/jz929/p/11372813.html

算法第四章作业

醉酒当歌 提交于 2019-11-27 17:49:56
算法第四章作业 对贪心算法的理解 所谓贪心算法,即是指从问题的初始状态出发,通过若干次的贪心选择而得到的最优值(或较优值)的一种求解问题策略,即贪心策略。其实贪心算法简单来说,就是在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法设计的关键在于贪心策略的选择,但贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备某个状态以后的过程不会影响以前的状态,只与当前状态有关的性质。在使用贪心算法的思想来解决算法问题时,主要是按照下面这样的思路进行: 将问题抽象为数学模型,也即是建立数学模型来描述问题。 把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。 把子问题的解局部最优解合成原来问题的一个解。 贪心算法主要适用于由局部最优策略能导致产生全局最优解的这样一些算法问题的解决中,其每一步都依赖于当前已经做出的所有选择。贪心算法也是一种自顶向下(就是每一步,根据策略得到一个当前最优解。传递到下一步,从而保证每一步都是选择当前最优的。最后得到结果)的算法。贪心算法具有的一个特征就是贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其他算法相比具有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。

算法第四章作业

帅比萌擦擦* 提交于 2019-11-27 16:32:31
算法第四章作业 对贪心算法的理解 总而言之,贪心算法的核心就是 “贪心”,即每一步都要达到当前情况的局部最优解。这样做的效果就是能够保证每一步做出的选择都是当前最优解,从而无限接近真实的最优解。 这样做比分治法的效率更高,而且只要同时满足贪心选择性质和最优子结构性质,基本上就能证明贪心算法所得出的结果基本上就是最优解。 说明汽车加油问题的贪心选择性质 当且仅当汽车剩余油量不足以让汽车行驶至下一个目的地时,汽车加油。这样能够保证加油的次数最小,能够让加的油得到最大程度的利用。 在本章学习过程中遇到的问题及结对编程的情况 事实上,虽然贪心算法从某种程度上是分治法的简化版本,但是要完全掌握还是有困难的。主要遇到的困难在于进行贪心算法的思考时,对于怎样达到贪心选择的思路的思考并不是十分顺利。故自身能力还需要加强。 结对编程过成中,因为贪心算法的思考方式不只有一种,所以难免与同伴产生分歧,但是最后都还是能够达成共识的。 来源: https://www.cnblogs.com/jumaodangdawang/p/11937736.html

第四章作业

你离开我真会死。 提交于 2019-11-27 16:31:04
1、贪心算法的理解   贪心算法的注重点在于局部,而不是全局,因为贪心算法主要是得到当前问题的最优解,且并不考虑之后的影响。所以,贪心算法的结果一定是问题的较优解,但不一定是最优解。 2、汽车加油问题   汽车加油问题,主要是让汽车加一次油的情况下,走最远的距离,停下加油的次数最少,就是汽车加油问题的贪心算法。 3、结对编程情况   队友很强,交流很顺畅,但是有时贪心算法策略思考不够周全,以致于不够“贪”!!! 来源: https://www.cnblogs.com/cmh2969/p/11937745.html

贪心算法解决钱币找零问题

送分小仙女□ 提交于 2019-11-27 16:18:13
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Coin { class Program { static void Main(string[] args) { int[] value = new int[] { 1, 2, 5, 10, 20, 50, 100 }; int[] count = new int[] { 3, 0, 2, 1, 0, 3, 5 }; int[] result = new int[count.Length+1];//将每个面额的货币使用数量记录下来,最后一个记录找零的情况 CoinMoneny(600,value,count,result);//600块进行找零 foreach (var item in result)//将找零的情况进行输出 { Console.WriteLine(item); } Console.ReadKey(); } /// <summary> /// 对货币进行找零 /// </summary> /// <param name="money"></param> /// <param name="value"></param>

c/c++算法之贪心与DP

别等时光非礼了梦想. 提交于 2019-11-27 14:33:27
题目背景: 那一年,这一年,青春散场,到毕业季,我们奔波着忙着找工作,来到招聘会上,看到黑压压的一大片人群.. 题目描述:毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。 假设现在有n个招聘会,每个招聘会都有个起止时间,时间由从招聘会第一天0点开始的小时数表示,n <= 1000 。 返回:最多参加的招聘会的个数n。 举个例子: 现在有3场招聘会,他们的起始时间为: 9-10 10-20 8-15 返回:2 这是英雄会的一个挑战题 下面是个人的实现方法,仅供参考,如有bug或者意见欢迎提出,共同交流 #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; bool cmp(const pair<int,int> &tmpa,const pair<int,int> &tmpb ) { if (tmpa.second<tmpb.second) { return 1; } else if (tmpa.second==tmpb.second) { if (tmpa.first<tmpb.first) { return 1; }

C++贪心算法实现马踏棋盘问题

淺唱寂寞╮ 提交于 2019-11-27 14:33:04
C++马踏棋盘的贪心算法 转载请注明: http://blog.csdn.net/l773575310/article/details/53727286 第一次看马踏棋问题时没有想到用贪心算法,结果穷举起来光5*5的棋盘也运行了很久才出来一条路径。然后看了不少关于马踏棋的解法,大体也看懂了,简单的的说,就是 让棋子每次走的下一个位置的出口尽可能少 。 贪心算法在这里体现: 尽可能走出口少的路,因为如果走出口多的路,后面出口少的路越多,越容易走到死路,即没有路可走。 看下图: 假设小马哥在图中的位置,且其他位置都还没有走过,他有6个红色位置可以走 如果他走右下角,那他只有一个出口(绿色的) 如果走左下角那个,那他有3个出口 以此类推:走偏左下角,5个 最后看一下小马哥下一个位置的出口数量: 如果为0说明走到死路,有可能是走完了所有格子,也有可能没有走完,那就需要往回走了(类似弹栈)。 下面就是代码了 首先是一些初始化 //宏定义,宽、高、一共的格子数 #define WIDTH 8 #define HEIGHT 8 #define PLACE_COUNT ((WIDTH)*(HEIGHT)) //放置棋子的位置 typedef struct position { int x; int y; }Position; //马棋可以走的8个方向(相对当前位置) vector