您的位置:首页 > 其它

三道类似的简单贪心

2015-10-23 21:48 253 查看
这几天遇到三道相似的贪心问题。

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 天的最低价格还要低的价格买到的,而不存在这样的价格,所以不存在更小的花费。

  如果容量和供应量都有上限,问题会更复杂,也许贪心思想不再适用,待见到了再来更新吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: