藍橋杯 旅行家的預算 貪心解法

2021-10-02 10:23:03 字數 1840 閱讀 7056

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

第一行為4個實數d1、c、d2、p與乙個非負整數n;

接下來n行,每行兩個實數di、pi。

如果可以到達目的地,輸出乙個實數(四捨五入至小數點後兩位),表示最小費用;否則輸出「no solution」(不含引號)。

275.6 11.9 27.4 2.8 2

102.0 2.9

220.0 2.2

26.95

這題貪心的點就是:(應該不用證明了把)

使用盡量便宜的油,走盡量遠的路程

貪心思路:

反覆貪心

每到達乙個油站,找出最便宜的油站(已經經過了的油站不考慮,不走回頭路),然後開始貪

if (最便宜的油站是當前站)

else

if (剩餘油量不夠到達終點,但是加油之後可以到)

else

// 這種情況說明油箱加滿也到不了終點

}else

// 這種情況是最便宜的油站在當前油站之後

else

// 這種情況說明剩餘油量到不了最便宜的油站

}

#include

#include

#include

using

namespace std;

double d1, c, p0, d2;

int n;

#define maxlen 114514

#define inf 1145141919

double di[maxlen]

;double pi[maxlen]

;int

main()

// 先判斷能不能到達終點

double max =0;

// 最大可達距離

double p =0;

// 當前位置

for(

int i=

1; i<=n; i++)}

if(p+max_dis < d1)

// 開始反覆貪心

double loc =0;

// 當前位置

double oil =0;

// 當前剩餘油量

double price =0;

// 消費

int lid =0;

// 當前所在油站的下標

while

(loc < d1)

}// 如果最便宜的在當前油站

if(di[idx]

== loc)

// 如果不夠油到終點,但是滿油能夠到達

else

if(loc+max_dis >= d1)

// 如果滿油也到不了,直接加滿

else

}// 如果最便宜的油站在當前油站之後

else

// 如果不能到達,在當前的油站加到剛好能夠到

else}}

printf

("%.2lf\n"

, price)

;return0;

}

貪心 旅行家的預算

問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離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 計算結果四捨五入至小數點後...

藍橋杯題目練習 旅行家的預算

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