贪心算法

龙龙的暑假贪心算法大冒险

為{幸葍}努か 提交于 2019-11-27 13:45:25
“今年暑假不AC?” “是的。” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。 作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是 能看尽量多的完整节目 ) Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。 Output 对于每个测试实例,输出 能完整看到的电视节目的个数 ,每个测试实例的输出占一行。 Sample Input 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 Sample Output 5看到这个有着暑假生活背景的问题,运用贪心算法, #include<iostream> #include<cstdio> #include

算法第四章作业

孤街醉人 提交于 2019-11-27 10:44:37
1. 对贪心算法的理解 贪心算法(又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不是从整体最优上加以考虑,所做出的选择是在某种意义上的局部最优解。 不是所有问题都能通过贪心算法得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法有两个基本要素:贪心选择和最优子结构。 贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到,这也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解是从贪心选择开始的,而且做了贪心选择后,原问题简化为一个规模更小的类似的子问题。然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响,而动态规划则相反。贪心算法对每个子问题的解决方案都做出选择,不能回退

【算法作业】算法第四章作业

北慕城南 提交于 2019-11-27 10:43:53
1.你对贪心算法的理解 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。求出来的解不一定是最优解。 2.汽车加油问题的贪心选择性质 当汽车上的油量足够支持他到达下一个加油站时,则汽车不用加油,否则汽车需要加油。 3.本章学习中,我觉得比较难的点是辨别贪心算法和动态规划,已经在做题时,如何找到正确的贪心选择,这个也是需要我不断的尝试与锻炼才能解决的。对于结对编程,真的是感受到队友的力量,很多时候我自己死活找不到错误,队友可以一眼指出,互相讨论的过程,也加深彼此对于知识的理解,所谓的1+1>2;就是这样吧。 来源: https://www.cnblogs.com/lhiscute/p/10054922.html

贪心题

我与影子孤独终老i 提交于 2019-11-27 07:40:32
动态规划的思想: https://blog.csdn.net/huang1600301017/article/details/81022658 贪心算法训练: https://blog.csdn.net/EliminatedAcmer/article/details/88402667 https://blog.csdn.net/gyhguoge01234/article/details/78156417 思路:Johnson算法: 1:将任务分为两类,A类任务t1<t2,B类任务t1>=t2 2:两类任务分别排序,其中A类按 t1 递增排序,B类按 t2 递减排序 3:合并两类,将第二类任务接到第一类任务后面,此时任务的顺序最佳 4:遍历所有任务,计算总耗时 说下我的理解,对于 t1作业来说肯定是一直运行的,那么对于 t2 作业则会有 空闲和堆积两种境况,按照最小耗时,显然是不允许出现空闲情况的,因此 要先将 作业中 t1<t2的 按照 t1递增的顺序执行,这样便不会出现空闲情况,对于 剩余作业中就是 t1 >=t2的作业了,此时t2作业还处于堆积情况中,当每执行一个作业,由于 t1>=t2,t2作业中堆积的作业耗时会越来越小,因此要先将 t2较大的先执行,否则t2较大的滞留在最后便会增加耗时,因此再将 t1>=t2的作业按照 t2递减的顺序执行,如此便为最小耗时。 /*

算法竞赛宝典-贪心算法

故事扮演 提交于 2019-11-27 05:54:59
/*删数问题 #include <iostream> using namespace std; int main() { string n; cin>>n; int len=n.length(); int s; cin>>s; int i,j,k; for(i=1;i<=s;i++) { for(j=1;j<len;j++) { if(n[j]<n[j-1]) { break; } } if(j<len) { len--; for(k=j-1;k<len;k++) { n[k]=n[k+1]; } } else{ len--; } } for(i=0;i<len;i++) { cout<<n[i]; } return 0; }*/ /*数列极差问题 #include <iostream> #include <algorithm> using namespace std; #define maxn 99999999; #define minn -1; int main() { int n; cin >> n; int a[50000 + 10],b[50000+10]; for(int i = 0;i < n;i ++ ) { cin >> a[i]; b[i]=a[i]; } int len=n; while(len>1)//求max { sort(a,a+n); a[0]=a[0

算法设计

不羁的心 提交于 2019-11-27 03:55:47
一、分治法 递归,找最大值最小值,整数相乘,归并排序,快速排序,线性时间选择,最近点对问题 二、动态规划   0-1背包问题 ,矩阵相乘问题,装配线调度问题,最长公共子序列,最优二分检索树,凸多边形最优三角剖分 三、贪心法   背包问题,活动选择问题,哈夫曼编码,最小生成树算法(Kruskal 和 Prim) 四、回溯法   n皇后问题,子集和数问题,0-1背包问题,旅行商问题,着色问题 五、图算法   图的表示,广度优先搜索,Dijkstra算法 来源: https://www.cnblogs.com/eaglezb/p/11343106.html

贪心算法 区间问题

坚强是说给别人听的谎言 提交于 2019-11-27 03:30:41
1. 单区间调度问题 问题定义:存在单一资源,有一组以时间区间形式表示的资源请求reqs={req-1, req-2, …, req-n},第i个请求希望占用资源一段时间来完成某些任务,这段时间开始于begin(i)终止于end(i)。如果两个请求req-i和req-j在时间区间上没有重叠,则说这两个请求是相容的,求出这组请求的最大相容子集(最优子集)。举个例子:有一间多媒体课室,某一个周末有多个社团想要申请这间课室去举办社团活动,每个社团都有一个对应的申请时间段,比如周六上午8:00-10:00。求出这间课室在这个周末最多能满足几个社团的需求。 解决方案:贪心算法,优先选择最早结束的需求,确保资源尽可能早地被释放,把留下来满足其他需求的时间最大化。具体伪代码如下所示,算法结束后集合A中会保留所有相容请求,A的大小即是最大相容数量。 初始化R是所有需求的集合, A 为空集 对R中的需求Ri,根据结束时间从早到晚排序 for Ri in R, do if Ri与 A 中的请求相容 A = A 并Ri endIf endFor return A 上述伪代码的C++实现如下 #include <iostream> #include <algorithm> #include <vector> using namespace std ; const int MAX_SIZE = 100 ;

noip纲要2012

自闭症网瘾萝莉.ら 提交于 2019-11-27 02:10:40
数据结构 队列 栈 堆 邻接矩阵 邻接表 边集数组 线段树 基础算法 搜索 分治 贪心 递推 各种排序 快排 冒泡 归并 拓扑 哈希表 并查集 图论算法 最小生成树(kruskal)prim我不会 = = 强连通分量tarjan 单源最短路spfa dijkstra 全图最短路floyd 二分图最大匹配匈牙利算法 最近公共祖先lca 离线tarjan算法 DP 简单线性动规 最大子段和、最大子矩阵和 字符串距离 背包问题 合并石子平方版 树形动规 转载于:https://www.cnblogs.com/neayo/archive/2012/11/08/2760101.html 来源: CSDN 作者: weixin_30294709 链接: https://blog.csdn.net/weixin_30294709/article/details/96113616

[洛谷P3942]:将军令(贪心)

蓝咒 提交于 2019-11-27 00:30:36
题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又想起了四月。 如果不是省选,大家大概不会这么轻易地分道扬镳吧?只见一个又一个昔日的队友离开了机房。 凭君莫话封侯事,一将功成万骨枯。 梦里,小$F$成了一个给将军送密信的信使。 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫。小F不因为自己的祸福而避趋之,勇敢地承担了这个任务。 不过,小$F$实在是太粗心了,他一不小心把两封密信中的一封给弄掉了。 小$F$偷偷打开了剩下的那封密信。他发现一副十分详细的地图,以及几句批文——原来这是战场周围的情报地图。他仔细看后发现,在这张地图上标记了$n$个从$1$到$n$标号的 驿站,$n\sim 1$条长度为$1$里的小道,每条小道双向连接两个不同的驿站,并且驿站之间可以通过小道两两可达。 小$F$仔细辨认着上面的批注,突然明白了丢失的信的内容了。原来,每个驿站都可以驻扎一个小队,每个小队可以控制距离不超过$k$里的驿站。如果有驿站没被控制,就容易产生危险——因此这种情况应该完全避免。而那封丢失的密信里,就装着朝廷数学重臣留下的精妙的排布方案,也就是用了最少的小队来控制所有驿站。 小$F$知道,如果能计算出最优方案的话,也许他就能够将功赎过

将军令:贪心算法

本小妞迷上赌 提交于 2019-11-26 23:33:10
当然如果你想像考场上傻掉的我一样打树上dp,那祝你码得愉快了。 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define set(p) memset(dp[p],0x3f,sizeof(dp[p])) 4 int dp[100005][5][5],n,fir[100005],l[200005],to[200005],cnt,k,p; 5 void connect(int a,int b){ 6 l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b; 7 l[++cnt]=fir[b];fir[b]=cnt;to[cnt]=a; 8 } 9 void dfs(int p,int f){ 10 for(int ii=fir[p];ii;ii=l[ii])if(to[ii]!=f)dfs(to[ii],p); 11 int t=100002,tt=100003;set(t);memset(dp[t],0,sizeof(dp[t]));dp[t][0][0]=1; 12 for(int ii=fir[p];ii;ii=l[ii])if(to[ii]!=f){ 13 t^=1;tt^=1;set(t); 14 for(int i=0;i<=k+1;++i)for(int j=0;j<=k;++j) 15 dp[t