贪心算法

leetcode-最后一块石头的重量

我只是一个虾纸丫 提交于 2019-12-27 04:22:23
class Solution { public int lastStoneWeight(int[] stones) { PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2)->o2-o1); for(int i=0;i<stones.length;i+=1){ queue.add(stones[i]); } while(queue.size()>0){ if(queue.size()==1){ return queue.poll(); } else{ int num1 = queue.poll(); int num2 = queue.poll(); queue.add(Math.abs(num1-num2)); } } return 0; } } 核心就是使用一个使用优先队列构造一个最大堆 很多时候看到最大的前几个等等,我们很容易想到使用贪心算法,而优先队列常用来解决贪心算法问题。 要记住了出队列用poll(),出栈用pop() 来源: CSDN 作者: dogndaxiaodong 链接: https://blog.csdn.net/weixin_41327340/article/details/103722990

【DP】+【贪心】【前缀和】洛谷P2893 [USACO08FEB]修路Making the Grade 题解

拟墨画扇 提交于 2019-12-26 19:11:10
正常的 没想到的 DP和玄学贪心。 题目描述 A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would like. His cows do not mind climbing up or down a single slope, but they are not fond of an alternating succession of hills and valleys. FJ would like to add and remove dirt from the road so that it becomes one monotonic slope (either sloping up or down). You are given \(N\) integers \(A_1, ... , A_N (1 \le N \le 2,000)\) describing the elevation \( (0 \le A_i \le 1,000,000,000)\) at each of \(N\) equally-spaced positions along the road, starting at the first field and

第十课 基础算法-贪心算法

我的未来我决定 提交于 2019-12-25 22:46:15
python数据结构与算法基础 第十课 tags: python 路飞学院 categories: python 基础算法 贪心算法 文章目录 python数据结构与算法基础 第十课 第一节 贪心算法 1. 贪心算法的介绍 第二节 贪心算法实际问题-找零问题 第三节 贪心算法实际问题-背包问题 第四节 贪心算法实际问题-拼接最大数字问题 第五节 贪心算法实际问题-活动选择问题问题 第一节 贪心算法 1. 贪心算法的介绍 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。 第二节 贪心算法实际问题-找零问题 问题:假设商店老板需要找零n元钱,钱币的面额有: 100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少? 贪心算法解决 # n是需要找给人的钱 t = [ 100 , 50 , 20 , 5 , 1 ] def change ( t , n ) : m = [ 0 for i in range ( len ( t ) ) ] for ind , money in enumerate ( t ) : m [ ind ] = n // money #

2018年寒假小记

时光总嘲笑我的痴心妄想 提交于 2019-12-25 14:03:52
2018.2.6 感觉自己这两天有一点蠢呀,问题想都不想就问了出去 2018.2.8 今天写了两到贪心算法的题,不难 但是我没有办法把它跟贪心算法联系到一起,不知道为什么是贪心算法 2018.2.8 我愿你是个谎,从未出现南墙。 笑是强忍的伤。 这两天没有颓废下去很开心,加油吧,贾伟娥子.......whatever you do,you can do wherever you go you can go 今天算是打卡的第一天吧 明天要开始学习英语和数学了 加油吧 多学英语总归没有坏处 2018.2.13 去了一趟市里,病了一场。懈怠两日时光...加油 英语改成一天100个啦 啦啦啦啦 来源: https://www.cnblogs.com/jweie/p/8423988.html

贪心算法

让人想犯罪 __ 提交于 2019-12-25 03:12:41
贪心算法的设计思想 贪心算法在解决这个问题的策略上目光短浅,仅仅依据当前已有的信息就做出选择,并且一旦做出了选择,无论将来有什么结果,这个选择都不会改变。换言之,贪心法并非从总体最优考虑,它所做出的选择仅仅是在某种意义上的局部最优。贪心算法对于大部分的优化问题都能产生最优解,但不能总获得总体最优解,通常能够获得近似最优解。 引例 [找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。 如果提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。 售货员分步骤组成要找的零钱数,每次增加一个硬币。选择硬币时所採用的贪婪准则例如以下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过终于所需的数目 引例分析 为使找回的零钱的硬币数最小,不考虑找零钱的全部各种方案,而是从最大面值的币种開始,按递减的顺序考虑各币种,先尽量用大面值的币种,仅仅当不足大面值币种的金额才会去考虑下一种较小面值的币种。这就是在採用贪婪法。 这样的方法在这里之所以总是最优,是由于银行对其发行的硬币种类和硬币面值的巧妙安排。 假设仅仅有面值分别为1,5和11单位的硬币,而希望找回总额为15单位的硬币,按贪婪算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币

词法分析中的“贪心算法”(读《C陷阱与缺陷》)

六眼飞鱼酱① 提交于 2019-12-25 01:38:21
1、一些专业名词的定义 符号:关键字+标志符+运算符 词法分析器:编译器中负责将程序分解为一个一个符号的部分,一般称为词法分析器。 符号之间的空白(空格符、制表符、换行符)被忽略。 因此代码1和代码2是等效的 代码1: 1 if (x > y) big = x 代码2: 1 i 2 f 3 ( 4 x 5 > 6 y 7 ) 8 b 9 i 10 g 11 = 12 x C语言中某些符号: 例1:/ 、*、= 特点:只有一个字符长。称为单字符符号 例2: /* 、==、以及标识符,包括了多个字符,称为多字符符号 简单的来说词法分析中的“贪心算法”就是,当C编译器读取了一个字符,他会继续读取连续最大范围内与它组成符号的其他字符。如果不能组成符,则停止。 规则:每个符号尽可能包含多的字符,编译器从左至右一个字符一个字符读入,如果该字符可能组成一个符号,那么再读入下一个字符,再判断已经读入的两个字符组成的字符串是否可能是一个字符的组成部分,如果可能,继续读入下一个字符,重复上述循环且判断,直到读入的字符组成的字符串已不再可能组成一个有意义的的符号。 需要注意的是:除了字符串和字符常量,符号的中间不能嵌有空白(空白符、制表符、换行符),例如 == 和 = = 是两个符号 代码3: 1 y=x /* p 代码4: 1 y=x/ *p 代码3则表示 /* 后面的全被注释,直到匹配到右注释符号

贪心算法

↘锁芯ラ 提交于 2019-12-25 00:32:35
应用场景-集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号。 贪心算法介绍 1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。 2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。 贪心算法最佳应用-集合覆盖 思路分析: 使用贪婪算法,效率高: 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合: 遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系) 将这个电台加入到一个集合中(比如ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。 重复第1步直到覆盖了全部的地区。 package com.atguigu.greedy; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; public class GreedyAlgorithm { public static void main(String[] args)

QBXT七月D1

岁酱吖の 提交于 2019-12-22 16:13:53
今天是lyd神仙讲课的第一天,可以感觉到的是这位神仙有着不同于他人的气质,比如他的表情包(雾) 好了来讲正经的) 今天讲的比较多的是模拟算法和一些比赛中的好习惯 high-level 这个名词的大体意思就是,你要明白自己在写什么,要现在脑海里构造出代码的答题思路,其实和我前一阵在搞的模块化码风比较像,我们不能看见一个题就开始写输入输出,而是应该理清思路,争取一次a掉。 这个思想会在这几天的讲课当中逐渐渗透 模拟 模拟这个东西是很水的一种算法了吧,它本身其实就是将人类语言翻译成代码,更准确的说就是:讲一个用日常大白话用计算机语言抽象的表达出来。 所以想要良好的掌握模拟算法,就要做到以下两点 1.优秀的读题能力 2.优秀的代码能力 例题 斗地主 斗地主,当然我懒得写(惆怅,但是还是借着这个讲一讲 开始high-level 这他妈是个啥?????????????? 恶心死了 手里有n张牌 有k个规则(k<?),每个规则可以打出一定的牌 请问最少要打出多少次牌 显然是个明显的深搜 大体的代码是这么写(但是lyd把所有重要的都去掉了(惆怅) void dfs(剩下多少张牌没打last,打了多少次牌ans) { if(last==0) 规则1 规则2 ...... 规则k } 总之这就使是hgih-level的一个良好体现,其实就是让你的代码思路更加清晰

算法学习之贪心法(背包问题)

China☆狼群 提交于 2019-12-22 04:09:31
贪心法介绍: 一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。 大体步骤: 贪心策略:制定贪心策略,并选择最佳的策略实施 局部最优解:通过策略,一步一步得到局部最优解。 全局最优解:把所有的局部最优解整合到一起,还原出原来问题的最优解。 示例如下 问题描述 假设山洞中有n种宝物,每种宝物有一定重量w和相应的价值v,毛驴运载能力有限,只能运走m重量的宝物,一种宝物只能拿一样,宝物可以分割。那么怎么才能让背包装走宝物的价值最大呢? 贪心策略 每次挑选价值最大的宝物装入背包,得到的结果是否为最优? 每次挑选重量最小的宝物装入背包,得到的结果是否为最优? 每次挑选价值单位重量价值最大的宝物装入背包,得到的结果是否为最优? 分析各策略后,我们挑选第三种策略:每次挑选价值单位重量价值最大的宝物装入背包。 思路 计算每件宝物的性价比 将宝物按性价比排序 按贪心策略依次将性价比最高的宝物放入背包 若是下一性价比最高宝物重量超过剩余背包容量,将宝物拆分后再放入背包 完整代码 #include<iostream> #include<algorithm> using namespace std; const int M = 10005; struct three { double w; // 宝物重量 double v; // 宝物价值 double p;

背包问题(贪心算法)

蓝咒 提交于 2019-12-19 12:39:12
  贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。   贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题。贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细节想不通。这个问题以后有机会再讲。本次讲一讲背包问题。   背包问题就是有若干物品,每个物品有自己的价值和重量。背包有总重量。问题就是怎样将背包装的最大价值。背包问题也分很多种,贪心算法解决的是物品可以拆分的背包问题(就是物品可以分成几份装入)。这个问题用贪心还是比较好解决的。贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。此问题就是将每次的放入看成每一步,要想解决问题,就是将每一步都放入最优解。也就是说,每一次的放入都要放入最佳的选择。讲到这里,就要说一说最佳的选择,每一次的放入的最佳的选择就是每次放入的物品都是剩余的物品中价值最大且质量最小的,这里就要引入一个物品的属性,物品的权重值。物品的权重值就是指物品的价值除以物品的质量。所以,本问题的每一次的最佳选择就是每次都选出权重值最大的物品。