旅行家的預算

2021-08-13 14:56:50 字數 1617 閱讀 5789

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n,油站i離出發點的距離d[i]、每公升汽油**p[i]。 計算結果四捨五入至小數點後兩位。 如果無法到達目的地,則輸出-1。

輸入共n+1行,第一行為d1,c,d2,p,n,以下n行,每行兩個資料,分別表示該油站距出發點的距離d[i]和該油站每公升汽油的**p[i]。兩個資料之間用乙個空格隔開。1 <= n <= 100

一行,輸出最少費用。 計算結果四捨五入至小數點後兩位。 如果無法到達目的地,則輸出-1。

275.6 11.9 27.4 2.8 2

102.0 2.9

220.0 2.2

26.95

首先我們來解析一下題目,有以下幾種情況:

輸出「-1」時,相鄰兩地間的距離》油箱容積*每公升油能走的距離

如果在當前點能到達的油站中有p[i]>p[now]的,就把油加到剛好能達到那個油站的程度

如果上乙個條件不成立,就把油箱加滿,開到能達到的油站中最便宜的那個去

(想一想:貪心策略的證明)

證明 1:很簡單,基本上都能想到

2:如果要到達點q,在需要錢數更小的情況下,顯然應該讓在現在所在的油站加的油盡量少,而在下乙個較便宜的油站加的多一點

3 : 基本上都能想到

#include

#include

using

namespace

std;

struct node

;node way[105];

double to_last,v,can,first_spend;

int n;

bool cmp(const node& x,const node& y)//將路程按從小到大排序

sort(way+0,way+n+2,cmp);

int now=0;//現在所在的油站

double nowv=0

/*現在的油量*/,sum=0

/*需要的錢數*/;

while(now<=n)

int flag=now+1,flag1=0

/*第乙個比當前油站**小的油站編號*/;

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

if(way[i].away-way[now].away<=v)//如果能到達

}else

break;

if(flag1)//如果有油站比當前油站**低

if(nowv>way[flag1].away-way[now].away)//油箱油足夠的情況

else

else

if(v>=way[n+1].away-way[now].away)//如果能直接開到終點

if(nowv>=way[n+1].away-way[now].away)//現有油量夠

now=n+1;

else

else

}if(sum)

printf("%.2lf\n",sum);

else

printf("-1");

return

0;}

旅行家的預算

問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入...

旅行家的預算

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入至小數點後...

旅行家的預算

又是抄的題解。自己做的時候一定要多想想可能的情況,因為考試只有一次機會。注釋寫在 裡了。include include include include define inf 9999999 using namespace std const int n 50005 int n double d1,c...