三道类似的简单贪心
2015-10-23 21:48
253 查看
这几天遇到三道相似的贪心问题。
1. 汽车加油问题(算法设计与分析基础 习题4-9)
初始时油量为n。从起点到终点之间有k个加油站,汽车油箱容量上限为n,每个加油站可无限量供应汽油。
给出n,k和相对位置(在一条直线上),求最少加油次数及对应加油记录。
贪心策略:一直走,当到不了站点 i 时,在i-1加油至容量上限n(距离超过n时无解)。
588a.cpp
这道题的背景本质上和前两道相同,只是由于容量和供应量都无上限,求最少购买次数没意义,所以增加了一个价格,求总花费的最小值。
贪心策略证明思路:最优值唯一,当没有重复的售价时,最优解也是唯一的。假设存在比贪心策略更小的花费,那么有第 i 天是用比前 i 天的最低价格还要低的价格买到的,而不存在这样的价格,所以不存在更小的花费。
如果容量和供应量都有上限,问题会更复杂,也许贪心思想不再适用,待见到了再来更新吧
1. 汽车加油问题(算法设计与分析基础 习题4-9)
初始时油量为n。从起点到终点之间有k个加油站,汽车油箱容量上限为n,每个加油站可无限量供应汽油。
给出n,k和相对位置(在一条直线上),求最少加油次数及对应加油记录。
贪心策略:一直走,当到不了站点 i 时,在i-1加油至容量上限n(距离超过n时无解)。
#include <cstdio> using namespace std; const int MAX_N=100005; int n; int a[MAX_N],p[MAX_N]; int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&a[i],&p[i]); int minn=p[0]; int ans=minn*a[0]; for(int i=1;i<n;i++) {//每遇到一个价格更小的值,一直在这里买,直到遇到下一个更小的值为止 if(p[i]<minn) minn=p[i]; ans+=a[i]*minn; } printf("%d\n", ans); return 0; }
588a.cpp
这道题的背景本质上和前两道相同,只是由于容量和供应量都无上限,求最少购买次数没意义,所以增加了一个价格,求总花费的最小值。
贪心策略证明思路:最优值唯一,当没有重复的售价时,最优解也是唯一的。假设存在比贪心策略更小的花费,那么有第 i 天是用比前 i 天的最低价格还要低的价格买到的,而不存在这样的价格,所以不存在更小的花费。
如果容量和供应量都有上限,问题会更复杂,也许贪心思想不再适用,待见到了再来更新吧
相关文章推荐
- VIM配置Python环境
- 关于java异常处理
- 常用oracle表空间查询语句
- hdu5500
- 【小学生必学!】虚拟机安装系统,演示Ubuntu-server的安装
- 电脑启动后出现checking file system on c:
- 二维数组的介绍、遍历以及长度的计算
- unix学习笔记------消息队列---发送消息
- 猎豹上市(猎豹的广告收入中有70%来自BAT三家公司,总收入中有58%来自BAT)
- hdu5500
- 黑马程序员—————— Java集合框架Collection
- 杀人游戏(hdu2211)插入法
- [转]测试淘宝站内的搜索系统
- java网络---实现多线程下载文件
- 浅谈MDK环境下使用#include <stdio.h>的问题
- unix学习笔记------消息队列的接收
- 日经春秋 20151023
- Java学习路线图——及时纠正自己的学习方向
- Morris遍历
- javascript中的模式解析——原型模式