一、经典例题

例一:排队接水

题意:n个人到r个水龙头接水,装满水桶的时间分别是t1,t2,t3....

接水时间是整数且互不相等,怎样安排顺序使每个人等待的

时间和最小。

题解:排队越靠前计算次数越多,因此越小的排在前面。

交换一下看看

例二:均分纸牌

题意:n堆纸牌,每堆若干张,但纸牌总数为n的倍数,求最少

移动多少次每堆纸牌的张数一样。

题解:贪心模拟,先让第一个人纸牌达到平均数,只交换1、2两

人的纸牌,不用考虑第2人纸牌不够给第1人的情况,因为分牌的

实际情况是让牌数最多的那堆先移动,所以第2人纸牌是绝对够提

供的。然后让第二人纸牌达到平均数。

例三:删数问题

题意:输入一个高精度正整数n,求删掉s个数位后,组成的新数最小。

题解:每次删一个使剩下的数最小的数。删去一个数后剩下数的位数

就确定了,只需要让最高位最小。

例四:导弹拦截问题

题意:给出n个炮弹高度,用导弹拦截,每一种导弹

发射的高度不能超过之前发射的高度,问一种导弹最多拦截

多少,要拦截所有需要多少导弹。

题解:第一问最长下降子序列。第二问:

做法一:贪心让之前高度最小的导弹拦截。

做法二:最少链划分 = 最长反链长度

做法二就是求最长上升序列长度。

例五:活动选择

题意:选择尽量多的区间,两两不相交。

题解:按结束时间排序,每次选择区间右端点最小的,

为剩下的区间留下更多的空间。

例六:整数区间

题意:数轴上有n个区间,选择尽量少的点使每个区间都有点

题解:通俗的想,把区间想成一块块木板,把要找的点想成钉子,

如果你的钉子很靠前的话,后面的木板就可能钉不到,每次把钉子

钉在你要钉的木板最后。

CODEVS线段覆盖大全//以前做的和现在码风不一样,一样好看=u=

PS:有的不是贪心一起整理了。

a、最多不相交线段覆盖所有区间

题解:右端点升序排序,左端点相同右端点小的优先。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
int x,y;
}s[];
bool cmp(E a,E b)
{
if(a.y==b.y)return a.x<b.x ;
return a.y<b.y;
}
int n,ans,last;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
if(s[i].x>s[i].y)
swap(s[i].x,s[i].y);
}
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
if(s[i].x>=last)
{
ans++;
last=s[i].y;
}
printf("%d\n",ans);
return ;
}

线段覆盖1

b、n条线段,每条选段有价值,求选两两不相交的线段,并使得价值和最大。

题解:不是贪心,是动态规划了。

dp[i]表示第i条线段选的最大价值。转移从不相交的转移来就可以了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
int x,y,v;
}s[];
int n,ans,f[];
bool cmp(E a,E b)
{
return a.y<b.y;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].v);
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
if(s[i].x>=s[j].y)
f[i]=max(f[j]+s[i].v,f[i]);
for(int i=;i<=n;i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
}

线段覆盖2

c、和线段覆盖1一样

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
int x,y;
}s[];
bool cmp(E a,E b)
{
if(a.y==b.y)return a.x<b.x ;
return a.y<b.y;
}
int n,ans,last;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
if(s[i].x>s[i].y)
swap(s[i].x,s[i].y);
}
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
if(s[i].x>=last)
{
ans++;
last=s[i].y;
}
printf("%d\n",ans);
return ;
}

线段覆盖3

d、和线段覆盖2一样,只是范围变大。

排序后。f[i]表示前i个线段所得最大值,线段覆盖3是n^2,从前一个

不想交的线段转移来。优化就是前缀最大值+二分查找,找右端点

小于当前线段左端点的线段p,从前缀p的最大值转移。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
long long x,y,v;
}s[];
long long mx[],f[],ans;
bool cmp(E a,E b)
{
return a.y<b.y;
}
int n;
long long erf(int l,int r,int x)
{
while(l<=r)
{
long long mid=l+(r-l)/;
if(s[mid].y>x)r=mid-;
else l=mid+;
}
return r;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld%lld",&s[i].x,&s[i].y,&s[i].v);
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
{
f[i]=max(mx[erf(,i-,s[i].x)]+s[i].v,f[i]);
ans=max(ans,f[i]);
mx[i]=max(f[i],mx[i-]);
}
printf("%lld\n",ans);
return ;
}

线段覆盖4

e、和4相同。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
long long x,y,v;
}s[];
long long mx[],f[],ans;
bool cmp(E a,E b)
{
return a.y<b.y;
}
int n;
long long erf(int l,int r,int x)
{
while(l<=r)
{
long long mid=l+(r-l)/;
if(s[mid].y>x)r=mid-;
else l=mid+;
}
return r;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld%lld",&s[i].x,&s[i].y,&s[i].v);
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
{
f[i]=max(mx[erf(,i-,s[i].x)]+s[i].v,f[i]);
ans=max(ans,f[i]);
mx[i]=max(f[i],mx[i-]);
}
printf("%lld\n",ans);
return ;
}

线段覆盖5

-------------------------------

以上是《信息学奥赛一本通》的例题,我的博客贪心分类里都有代码。

很多贪心题目,都会依靠经典题的思想或者是变形。

-------------------------------

二、历年NOIP贪心题目

题目一、Noip2011观光公交

题意:n个景点和游客上下车时间,有k个加速器可以使边长-1,

如何使用加速器使乘客旅行时间总和最小。

题解:一开始我只是在经过人数最多的边加加速器,后来发现

在i边使用加速器后会影响后面的人,很好的题。

题目二:Noip2012国王游戏

题意:n个人,每个人左右手都有数字,每个人获得的值是前面人左

手乘积除以本人右手乘积。

题解:交换两个大臣的位置比较交换后的差别

题目二:Noip2012疫情控制

题意:略。

题解:本来看起来是个很难的图论题,贪心是解决问题的突破口。

所有士兵向上走覆盖的子树多。

题目三、Noip2013火柴排队

题意:求sigma(ai-bi)^2最小

题解:要想sigma(ai-bi)^2最小,需要ai与bi的差最小,将ai,bi排序,

小的对应小的,大的对应大的。

三、总结

贪心的策略:

(1)证明,常用的方法是交换。

(2)猜呗。

贪心的思想:只顾眼前,忽略整体,只看局部。

CCL贪心大法好!

 

【经典】Noip贪心的更多相关文章

  1. HDU 1789 Doing Homework again(非常经典的贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDOJ2037 今年暑假不AC (经典的贪心问题)

    Description “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会 ...

  3. 观光公交noip<贪心>

    题目链接:https://www.oj.swust.edu.cn/problem/show/1190 思路: 每在一段路上使用一次加速器,就会对某些人或者说某些路段上的人产生影响,目的是使产生的影响最 ...

  4. 51Nod - 1205 (流水先调度)超级经典的贪心 模板题

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1205 N个作业{1,2,…,n}要在由2台机器M1和M2组成 ...

  5. [POJ3197]Stall Reservations (贪心)

    题意 (来自洛谷) 约翰的N(l<N< 50000)头奶牛实在是太难伺候了,她们甚至有自己独特的产奶时段.当 然对于某一头奶牛,她每天的产奶时段是固定的,为时间段A到B包括时间段A和时间段 ...

  6. Too Rich(贪心+DFS)

    Too Rich http://acm.hdu.edu.cn/showproblem.php?pid=5527 Time Limit: 6000/3000 MS (Java/Others)    Me ...

  7. 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划

    [BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...

  8. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

  9. HDOJ.1009 FatMouse' Trade (贪心)

    FatMouse' Trade 点我挑战题目 题意分析 每组数据,给出有的猫粮m与房间数n,接着有n行,分别是这个房间存放的食物和所需要的猫粮.求这组数据能保证的最大的食物是多少? (可以不完全保证这 ...

随机推荐

  1. Spring Boot 快速入门(IDEA)

    从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架:SpringBoot帮助开发者快速启动一个Web容器:SpringBoot继承了原有Spring框架的优秀 ...

  2. 文件(1)--File

    File简介 Java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等),不能对文件的内容进行 ...

  3. nginx官网下载&百度云分享

    官网下载的链接: nginx官网下载地址:http://nginx.org/download/ 百度云分享 链接:https://pan.baidu.com/s/16m6zrFSkYCJtX0rD2Y ...

  4. Dijkstra算法 - 最短路径算法

    2017-07-26 22:30:45 writer:pprp dijkstra算法法则:设置顶点集合S,首先将起始点加入该集合,然后根据起始点到其他顶点的路径长度, 选择路径长度最小的顶点加入到集合 ...

  5. centos 安装jdk/resin/mysql

    一.安装JDK 1.判断是否安装 java -version 我的计算机上使用java -version命令,内容如下: java version "1.7.0_45"OpenJD ...

  6. java可变参数列表的实现

    参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数, ...

  7. RabbitMQ 之 WorkQueues工作队列

    模型图 为什么会出现 work queues? 前提:使用 simple 队列的时候 (上一篇博客)我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的(发送消息即可),而消费者接 ...

  8. 10 个深恶痛绝的 Java 异常

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 今天,来列一下 Java 中经常遇到的前 10 个异常,排名 ...

  9. 《JavaScript高级程序设计》第6章补充 继承

    基于原型链继承 将父类的实例赋给子类的prototype来实现继承. 原理:父类的实例有父类所有的实例属性和原型方法,将它赋给子类的prototype后,子类的创建的实例就有会__proto__属性指 ...

  10. idea解决properties乱码问题

    问题:我的IDEA已经将文件的字符集设置成了UTF-8,但是中文在*.properties文件中还是会出现乱码,后来经同事指点修改了一项配置就ok了!话不多说,看下面的对比就清楚了. 设置前: 设置后 ...