noip知识点总结之--贪心

一、什么是贪心

贪心算法嘛、、、

就是在对某个问题求解时,总是做出在当前看来是最好的选择

In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解

二、贪心算法的适用前提

局部的最优解能导致最后整体的最优解,即局部的最优解不受该部分以外的东西的影响

对于贪心算法,我们需要证明:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的

实际上,能用贪心算法的问题很少,大部分看上去能用贪心算法去做的题目,其实都得不到最优解T T(这时候就需要运用动态规划了)

而看上去不能贪心的问题经过转化,反而可以运用贪心求解(额这个…)

三、贪心算法的基本思路:

(1)问题转化

(2)把求解的问题分成若干个子问题

(3)对每一子问题求解,得到子问题的局部最优解

(4)把子问题的解局部最优解合成原来解问题的一个解

↑上面那些@#%^*¥…&*#¥%@是不是太烦了。。。谁不懂”贪心”这两个字啊≥v≤~

所以在实际问题中进行分析即可!

(概括为两句话:贪心算法就是按照字面意思求局部最优;但局部最优不一定是整体最优,故需要证明成立)

四、简单贪心算法例题

BZOJ1689 [Usaco2005 Open] Muddy roads 泥泞的路

给一个长度为N的格子,一些格子有水。现在有长度为L的东西(比如,木板)覆盖,问至少要用几木板才能把水坑都盖住。

解法是:每个木板在当前满足条件的情况下尽量往后放。

证明:假设当前i有水,i-1没有水,因为长度是固定的,那么显然从i放,由于从i-1放木板有可能会少盖住一个后面的水池。

于是模拟怎么放木板即可。

另两题:

BZOJ2014 [Usaco2010 Feb]Chocolate Buying

BZOJ3544 [ONTAK2010]Creative Accounting

五、进阶版贪心算法例题

BZOJ1658 [Usaco2006 Mar]Water Slides 滑水

一维坐标轴上有n个点,有些点之间有单向滑梯,现在要滑完所有滑梯仅一次,问走的路最少的解法。(n = 10000)

一开始建立的是网络流模型:

(1)把点分成出度>入度和入度>出度两种

(2)跑一遍网络流

然后会发现由于n很大,会TLE,于是进行改进:

发现两条滑梯交叉滑一定没有不交叉滑来得好(就是简单地贪心思想)

于是对两类点排序,直接一个一个配对答案一定是最小的。

另一题:

BZOJ1367 [Baltic2004]sequence

六、贪心的更多例题

BZOJ1046 [HAOI2007]上升序列

BZOJ1691 [Usaco2007 Dec]挑剔的美食家

BZOJ1150 [CTSC2007]数据备份Backup

七、More about贪心

贪心作为一类重要的信息学算法,一般并不是单独使用的

有时会利用堆来优化,也可能配合hash甚至平衡树进行问题的求解

当然也可以作为一个算法的一部分(如Dijkstra),或者”部分贪心思”

当然这种看似简单、其实内容丰富的算法就可以被出在NOIp中。。。。。。

时间: 2024-10-21 11:17:18

noip知识点总结之--贪心的相关文章

Noip知识点总结

算法思想: 1.模拟 2.搜索    (Search) 枚举(穷举) / 遍历 / 剪枝 / 产生式系统(估价函数)/双向BFS/记忆化搜索 3.查找(字典):折半查找(二分法) / 树形查找(二叉排序树) / Hash 4.递推或归纳 (To 数学方法)  >  递推式  > DP  (ex: 4 Hanoi Tower Problem) 5.分治    (Divided and Conquer)  二分答案 6.贪心    (Greedy) 实现技巧:  循环 递推(顺推/倒推)  >

noip推荐系列:汽艇[贪心]

[问题背景] 一天sxc,zsx,wl到gly坐汽艇,本来和其他的人约好了一起去,结果被放了鸽子,3人便只有一人负担x元去坐汽艇(很贵哦).坐了才发现如果汽艇上人多了位置就不宽敞,就不好玩了.而3个人貌似是最好玩的,但究竟是不是呢? [问题描述]  假设有n个人要去坐1个汽艇,每个人单独坐汽艇的快乐程度是Ci,每多一个人,他的快乐程度会减去Di,请求出使快乐程度之和达到最大的方案.(假设汽艇的容量足够大). [文件输入] 输入文件共有3行:  第1行是一个整数n:  第2行有n个整数,依次表示每

noip知识点总结之--欧几里得算法和扩展欧几里得算法

一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a mod b) (其中a mod b != 0)  或  b (其中a mod b == 0) 证明: 后半部分呢...是废话,于是只要证明前半部分即可. 不妨设g = gcd(a, b),于是有 a = g * A, b = g * B 且 (A, B) = 1 故gcd(b, a mod b) =

【浮*光】#noip# 知识点总结

[零. 序言] ------头文件 #include<cstdio>    #include<iostream>    #include<cstring>    #include<string>    #include<algorithm>    #include<cmath>    #include<set>    #include<vector>    #include<map>    #inc

noip知识点总结之--线性筛法及其拓展

一.线性筛法 众所周知...线性筛就是在O(n)的时间里找出所有素数的方法 code: void get_prime(int N){ int i, j, k; memset(Flag, sizeof(Flag), 0); for (i = 2; i <= N; ++i){ if (!Flag[i]) p[++tot] = i; for (j = 1; j <= tot; ++j){ if ((k = i * p[j]) > N) break; Flag[k] = 1; if (!(i %

Noip2017知识点备考

作为一个oier,适当的整理是有必要的.蒟蒻根据自己的理解,筛选出考noip应当掌握的知识点.可能后期还有解题思路和模板,先挖个坑慢慢补呗. 60级张炳琪Noip知识点总结 一.知识点 (一).暴力求解法 1.模拟算法,模拟模型建立 2. dfs洪水模型  迷宫模型  最优性可行性剪枝,记忆化搜索 3. bfs    双向宽搜    判重的方法 4.枚举法 (二)图论相关 1. 最短路算法,堆优化迪杰斯特拉,floyed,SPFA 2. 最小生成树 kruskal     prim算法 3.缩点

NOIp模拟1 Graph

问题背景 本套模拟题旨在复习各个noip知识点 试题描述 给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入格式 第 1 行,2 个整数 N,M. 接下来 M 行,每行 2 个整数 Ui,Vi,表示边 <Ui,Vi>.点用 1,2,...,N 编号. 输出格式 N 个整数 A(1),A(2),...,A(N). 输入示例 4 31 22 44 3 输出示例 4 4 3 4 注释说明 对于 60% 的数据,1 ≤ N,K ≤ 10^3

2017-2018OI学习记录

$Mingqi_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始吧. 11.29 NOIp图论(Ⅰ) 坑:Floyd.Dijkstra.最短路计数.Tarjan.二分图.拓扑. 最短路计数: #include<queue> #include<cstdio> #include<cstring> using namespace std; co

[个人][AFO] OI回忆录 The End

前言 微微颤抖的双手敲击键盘,身处从长沙飞驰的高铁,返回家乡. 我知道终将离别,但我不知道离别到来的如此之快.内心有些怅惘,微微的失落,却是又无可奈何. 没有后悔,没有怨念,有的只是一丝丝不舍,舍不得的却是太多. 是时候做一个完结了,结束,也就意味着一个新的开始. 初识OI 是的,两年前初识OI,我还是一个不谙世事的少年,带着对未来的憧憬,带着对高中的期待,踏入这所全国著名的中学. 缘起,卓越之旅理科夏令营. 我还记得营服背后那句话 "给理想一点时间" 当时并不知道什么叫做竞赛,以为只