贪心法例题讲解

发布 2022-10-28 19:49:28 阅读 5066

旅行家的预算(acm)

旅行家的预算

problem description

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离d1、汽车油箱的容量c(以升为单位).每升汽油能行驶的距离d2、出发点每升汽油**p和沿途油站数n(n可以为零),油站i离出发点的距di、每升汽油** pi( i=l,2,..n)。

计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“no solution”。input

输入数据的第一行是四个实数;

d1 c d2 p分别表示两个城市之间的距离,汽车油箱的容量,每升汽油能行驶的距离,出发点每升汽油格;

第二行是一个整数n,沿途的油站数。

第三行到第n+2,每一行是一个油站的基本信息描述,包括该油站离出发点的距离,该油站每升汽油的格。 output

输出到达目的城市的最小费用(四舍五入到两位小数),若不能到达目的城市则输出 no solution

sample input

sample output

problem source

/ 测试用例。

分析:需要考虑如下问题:

1) 出发前汽车的油箱是空的,故汽车必须在起点(1号站)处加油。加多少油?

2) 汽车行程到第几站开始加油,加多少油?

可以看出,原问题需要解决的是在哪些油站加油和加多少油的问题。对于某个油站,汽车加油后到达下一加油站,可以归结为原问题的子问题。因此,原问题关键在于如何确定下一个加油站。

通过分析,我们可以选择这样的贪心标准:

对于加油站i,下一个加油站j可能第一个是比油站i油价便宜的油站,若不能到达这样的油站,则至少需要到达下一个油站后,继续进行考虑。

对于第一种情况,则油箱需要(d(j)-d(i))/m加仑汽油。对于第二种情况,则需将油箱加满。

贪心算法证明如下:

设定如下变量:

value[i]:第i个加油站的油价;

over[i]:在第i站时的剩油;

way[i]:起点到油站i的距离;

x[i]:x记录问题的最优解,x[i]记录油站i的实际加油量。

首先,x[1]≠0,over[1]=0。

假设第i站加的x[i]一直开到第k站。则有,x[i]..x[k-1]都为0,而x[k]≠0。

1 若value[i]>value[k],则按贪心方案,第i站应加油为。

t=(way[k]-way[i])/m-over[i]。

若t若t>x[i], 则预示着,汽车开到油站k,仍然有油剩余。假设剩余w加仑汽油,则须费用value[i]*w,如果w加仑汽油在油站k加,则须费用value[k]*w,显然value[k]*w2 若value[i] t=c-over[i即加满油)。

若t若t>x[i],则表示在第i站的不加满油,而将一部分油留待第k站加,而value[i]综合上述分析,可以得出如下算法:

i :=1

l :=c*d2;

repeat

在l距离以内,向后找第一个油价比i站便宜的加油站j;

if j存在 then

if i站剩余油能到达j then

计算到达j站的剩油。

else在i站购买油,使汽车恰好能到达j站

else在i站加满油;

i :=j汽车到达j站}

until 汽车到达终点;

方法一:#include<>

double p[101],dist[101];

double c,dic;

int n;

double cost,rest,need;

void init()

double box,dd,pp;

int k,i;

scanf("%lf%lf%lf%lf%d",&box,&c,&dic,&p[0],&n);

dist[n+1]=box;p[n+1]=0;dist[0]=0;

for(i=1;i<=n;i++)

void wo()

int j,k,min1,min2;

rest=cost=k=0;

while(k<=n)

if(j==k)

if(min1!=0)else

int main()

init();

wo();printf("%0.2lf",cost);

2、 活动安排问题

问题描述] 假设有一个需要使用某一资源的n个活动组成的集合s,s=。该资源一次只能被一个活动所占用,每一个活动有一个开始时间bi和结束时间ei (bi≤ei)。若bi≥ej或者bj≥ei,则活动i和活动j兼容。

你的任务是:选择由互相兼容的活动组成的最大集合(活动最多)。

输入格式]

输入文件名为:共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用空格隔开),格式为:

nb1 e1

bn en输出格式]

输出文件名为:共两行,第1行可举办活动的个数,第2行为最大集合中的活动序号,每个数据之间用一个空格隔开。按活动先后输出。

样例输入]

样例输出]

活动安排问题。

一个由需要使用某一资源的n个活动组成的集合s = 该资源一次只能被一个活动占用。每个活动i有个开始时间s[i]和结束时间f[i],且s[i]

如果[s[i], f[j])与[s[i], f[j])互不重叠,则称活动i和j是兼容的。活动安排问题就是要选择一个由互相兼容的问题组成的最大集合。

活动安排问题是可以用贪心算法有效求解的一个很好的例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

设有n个活动的集合e=,其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si#include <>

void greedyactivityselector(int n, int *s, int *f, int *a);

void printactivity(int n, int *s, int *f, int *a);

* n:活动个数。

* s:活动开始时间。

* f:活动结束时间。

* 假设输入的活动按结束时间递增序排列:f[1]

* a:记录所选择的集合。

int n,s[100],f[100],a[100]=;

void qsort(int lx,int rx){

int i,j,x,t;

i=lx;j=rx;

x=(i+j)/2;

do{while(f[i] while(f[j]>f[x]) j--;

if(i<=j){

t=f[i];

f[i]=f[j];

f[j]=t;

2024年税法例题

1 某企业2月份向农业生产者购进免税农产品l00万元,当月销售粮食200万元 不含税 上月未抵扣完进项税额2万元。外购货物支付进项税额21万元,但购进货物当月因管理不善发生霉烂变质损失2 3,当月销售塑料制品234万元 含税 进口科研仪器50万元 不含税 外购设备用于集体福利和个人消费10万元 含税...

光纤例题讲解,习题

例题讲解。1 一阶跃型单模光纤,纤芯半径,折射率,相对折射率差,光纤长度l 1km.一阶跃型多模光纤,纤芯半径,折射率,相对折射率差,光纤长度l 1km.求 单模和多模光纤各自的数值孔径角na 2 单模和多模光纤各自的子午光线最大时延差 3 试比较单模和多模光纤两种结果做简单说明。解 单模 多模 2...

砌体结构例题讲解

某带壁柱墙,截面尺寸如图2 26所示,采用烧结普通砖mu10 水泥混合砂浆m5砌筑,施工质量控制等级为b级。墙上支撑截面尺寸为200mm x 500mm的钢筋混凝土梁,梁端搁置长度为370mm,梁端支承压力设计值为75kn,上部轴向力设计值为170kn。试验算梁端支承处砌体的局部受压承载力。解题思路...