贪心算法

学霸的迷宫 BFS+贪心

馋奶兔 提交于 2020-02-10 13:02:59
问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 时间限制: 1Sec 内存限制: 128MB 提交: 558 解决: 111 题目描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。 输入 第一行两个整数n, m,为迷宫的长宽。 接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。 输出 第一行一个数为需要的最少步数K。 第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。 样例输入 3 3 001 100 110 样例输出 4 RDRD 提示 有20%的数据满足:1<=n,m<=10 有50%的数据满足:1<=n,m<=50 有100%的数据满足:1<=n,m<=500 思路

[USACO2005][POJ3045]Cow Acrobats(贪心)

拟墨画扇 提交于 2020-02-10 08:20:21
题目: http://poj.org/problem?id=3045 题意:每个牛都有一个wi和si,试将他们排序,每头牛的风险值等于前面所有牛的wj(j<i)之和-si,求风险值最大的牛的最小风险值 分析:这就是noip2012 T2的来源= =只不过这里是加,noip里是乘 不妨设所有牛都按最优顺序排好了,考虑相邻的两头牛i和i+1,如果交换他们的位置,那么对前面和后面的结果都无影响,只是他们两个的风险值变化了(变大了),于是我们可以得到这个时候i和i+1的关系 设w1+w2+...+wi-1=W 那么如果i和i+1不交换: i的风险值:W-si ① i+1的风险值:W+wi-si+1 ② 如果i和i+1交换: i+1(现在在第i个位置)的风险值:W-si+1 ③ i(现在在第i+1个位置)的风险值:W+wi+1-si ④ 很容易可以看出②>③,④>①,而又假设原顺序是最优的,那么后来交换后肯定不是最优的,即②<④,即wi+si<wi+1+si+1,即最优序列一定满足wi+si<wi+1+si+1 所以算法很简单,按wi+si排序即可 总结:看见求最大的最小不能定式思维二分,当二分不行时可以观察题目的特点,抓住特点很重要 来源: https://www.cnblogs.com/wmrv587/p/3700452.html

贪心算法 一本通

浪尽此生 提交于 2020-02-07 17:40:11
1322:【例6.4】拦截导弹问题(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 8465 通过数: 3237 【题目描述】 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的** 第一发炮弹能够到达任意的高度 ,但是以后 每一发炮弹都不能高于前一发的高度 **。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。 【输入】 n颗依次飞来的高度(1≤n≤1000)。 【输出】 要拦截所有导弹最小配备的系统数k。 【输入样例】 389 207 155 300 299 170 158 65 【输出样例】 2 【提示】 输入:导弹高度: 4 3 2 输出:导弹拦截系统k=1 分析:贪心算法,对于系统来说系统尽量开得少,对于每个系统拦截导弹来说,尽量拦截较高(多)的导弹。 开一个数组,记录每个系统能拦截的最低的导弹;然后每来一个导弹就要从已经开的系统中找出一个能拦截导弹的高度比他大的且差值最小的,因为你不能让当前能拦截较高导弹的系统拦截这个导弹,你只需一个个将儿能拦住他的就行;如果能找到,修改这个系统能拦截的 最低高度,如果不能再开一个系统

贪心算法

好久不见. 提交于 2020-02-05 12:41:09
贪心策略:总是考虑在当前状态下局部最优的策略,一定满足最优子结构,不断地把问题归纳为更小的相似地子问题 拟阵:许多用贪心算法求解的问题,可以表示求带权拟阵的最大权独立子集问题 区间贪心 : 一、区间不相交问题 总是选择左端点最大的区间 struct node{ int x,y; }a[maxn]; bool cmp(node a,node b){ if(a.x!=b.x) return a.x>b.x; //先按照左端点从大到小排序 else return a.y<b.y; //不然就是右端点从小到大 } sort(a,a+n,cmp); int ans=1,lastx=a[0].x; for(int i=1;i<n;i++){ if(a[i].y<=lastx){ ans++; lastx=a[i].x; } } 二、区间选点问题 最少确定多少个点,才能使每个闭区间都至少存在一个点,和区间不相交问题一样,只需要改成a[i].y<lastx就可以了 最小生成树算法 :常用的是prim和kruskal算法,都是采用了贪心的思想,但是策略不一样。 背包问题 一、部分背包问题:可以选择拿一件物品地部分东西,这个完全可以用贪心,选择当前单位价值最大的 二、01背包问题:因为要和选和不选的两种情况比较,所以产生的子问题互为重叠,需要用动态规划 来源: https://www.cnblogs

看电视(贪心算法)

≯℡__Kan透↙ 提交于 2020-02-04 13:07:27
问题 A: 看电视 时间限制: 1 Sec 内存限制: 32 MB 提交: 927 解决: 432 [ 提交 ][ 状态 ][ 讨论版 ][命题人: 外部导入] 题目描述 暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。 现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 输入 输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。 接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。 当n=0时,输入结束。 输出 对于每组输入,输出能完整看到的电视节目的个数。 样例输入 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0 样例输出 5code: /*算法:使用贪心算法,时间按照开始时间从小到大的顺序排列, *如果开始时间相同,那么按照结束时间从小到大的顺序排列。之 *后使用lastTV保留上一个最优解,如果下一个区间的开始时间大 *于lastTV的结束时间,那么更新lastTV,直至所有区间被遍历完 */ #include <iostream> #include <algorithm> /*节目结构*/ struct program

【贪心算法】背包问题

心已入冬 提交于 2020-02-04 12:27:53
题目:有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30 思路: 让你把物品一个个的往包里装,要求装入包中的物品总价值最大,要让总价值最大,就可以想到怎么 放一个个的物品 才能让总的价值最大,因此可以想到如下三种选择物品的方法, 即可能的局部最优解 : ①:每次都选择价值最高的往包里放。 ②:每次都选择重量最小的往包里放。 ③:每次都选择单位重量价值最高的往包里放。 找到可能的局部解以后,分析每一种解能不能合起来变成总体最优解,对以上三中局部解一一分析: ①:选择价值最高的,就会忽略了重量,若 M=50, 物品1: 重量:50,价值:40 物品2: 重量:20,价值30 物品3: 重量:30,价值30 显然,对于上述情况,该局部解行不通。 ②:选择重量最小的,就会忽略了价值,同①策略类似。 ③:该策略总是能让装入包中的物品总价值最大,所以该策略是正确的贪心策略。 注:(http://blog.csdn.net/a925907195/article/details/41314549 该篇博客说第三种情况在一下情况是错的, 物品:A B C 重量:28 20 10 价值:28

贪心算法----部分背包问题(java实现)

别说谁变了你拦得住时间么 提交于 2020-02-04 02:21:23
部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大. 代码: import java.util.Scanner; public class BackPack { /* Sort 将物品按价值比从大到小排放在数组 */ void Sort(int n ,float []v,float w[]) { float temp1; float temp2; for (int i = 1; i <= n; i++) { for (int s = 1; s <= i; s++) { if (v[i] / w[i] > v[s] / w[s]) { temp1 = v[s]; temp2 = w[s]; v[s] = v[i]; w[s] = w[i]; v[i] = temp1; w[i] = temp2; } } } } void Knapsack (int n,float W,float v[],float w[],float x[],float v2[],float w2[]) { BackPack a = new BackPack(); a.Sort(n, v, w); int i, ad; for

基础算法7-贪心算法

若如初见. 提交于 2020-02-03 03:49:56
贪心算法: 在某一个标准下(自己提供的贪心策略),优先考虑最满足标准的样本,最后考虑最不满足标准的样本,最终得到的一个答案的算法,叫做贪心算法。 也就是说,不从整体上最优上加以考虑,所做出的是在某种意义上的局部最优解。 局部最优 -?-> 整体最优 题目一: 一些项目要占用一个会议室宣讲,会议室不能同时容纳2个项目的宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目),你来安排宣讲的日期,要求会议室进行的宣讲场次最多。返回这个最多的宣讲场次。 解法: 策略1 把持续时间最短的先安排 --不对 策略2 安排开始时间最早的项目 --不对 策略3 结束时间早的项目先安排 – 对 全局最优解 自己脑补各种贪心策略,用 小数据量暴利尝试的方式 选择一个最好的贪心策略。 题目二: 给定一个字符串类型的数组strs, 找到一种拼接方式,使得把所有字符串拼接起来后形成字符串具有最小的字典序。 (字典序:两个单词 谁的单词放在前面 他们的值就小。 如果两个字符串长度一样 按照数值直接比,abc < cde, 长度不等时 短的后面补0 再比较。) 解法: 策略1: 按照单个字符串 最小字典序进行排序拼接–不对 比如【‘ba’,‘b’】–》bab < bba 策略2: str1, str2 结合起来看 谁作为前缀 字典序更小,谁就放前面。str1+str2 < str2

[专题八] 贪心算法

被刻印的时光 ゝ 提交于 2020-02-01 12:43:26
贪心算法 区间选点 /* 给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。*/ const int N = 100010; int n; struct Range { int l, r; bool operator< (const Range &W)const { return r < W.r; } }range[N]; int main() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d%d", &range[i].l, &range[i].r); sort(range, range + n); int res = 0, ed = -2e9; for (int i = 0; i < n; i ++ ) if (range[i].l > ed) { res ++ ; ed = range[i].r; } printf("%d\n", res); return 0; } 最大不相交区间 /* 给定N个闭区间[ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。输出可选取区间的最大数量。 */ const int N = 100010; int n; struct Range { int

贪心算法

狂风中的少年 提交于 2020-01-30 04:43:34
贪心算法—区间:先排序(按左端点升序,右端点降序(或相反)),记录最后一个的起点,int s1=10000;遍历比较; 问题 A: 看电视 题目描述 暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。 现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 输入 输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。 接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。 当n=0时,输入结束。 输出 对于每组输入,输出能完整看到的电视节目的个数。 样例输入 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0 样例输出 5 #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; struct program { int start; int end; } a[101]; bool cmp(program a,program b) { if(a.start==b