題目描述:
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離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」(不含引號)。
思路:
核心思想就是這一路的用油量是固定的,所有能用便宜的油,就用便宜的油,就是所謂的貪心
首先把起點和終點都看成是乙個加油站,每次只分析當前站點和下乙個站點的 油錢和距離,比如總共有4個加油站(包含起點和終點),我們從起點開始,
先分析,如果從起點加滿油,是否能夠到達下一站點,如果到不了就說明肯定是"no solution",如果可以到達,
再分析,在當前站的距離範圍內(也就是加滿油的情況下),哪一站的油錢最便宜,就以這一站為下一站,加夠可以到達下一站的油即可;若是範圍之內的各站的油都沒有當前站的油便宜,就把自己的油加滿,加滿之後,以在當前站距離範圍內,相對於當前站最遠的那個站作為當前站,繼續分析下一站…以此類推
再新增乙個圖:
便於理解整個過程,以及下面**中的left變數的含義,假設起點為當前站,第一站為下一站,但是第一站太貴,但從起點又到不了第二站,因此把油加滿可以到達g點,此時再以第一站為當前站,g點到第一站的距離除以一公升油的距離便成了剩油量(所謂的剩油量就是第一站開往第二站時,油箱裡還有left這麼多的油),如圖:
// 把起點、終點也看成乙個加油站
price[0]
= p;
price[n+1]
=0;for
(i =
1;i <= n+
1;i ++)}
for(i =
0;i <= n;i = j)
if(price[j]
< price[i])}
// 只要下一站的油錢便宜,就在保證能開到下一站的基礎上,換油,換便宜的
if(price[j]
< price[i]
)else
}printf
("%.2f\n"
,sum)
;return0;
}再分享#include「iomanip」檔案頭中的乙個知識點:cout << setw(x) << setfill(『0』) << y ;
setw(x) -> 限制輸出的位數(比如x=5,即輸出時數字為5位的)
setfill() -> 空餘的位上用 『0』 來補上
比如這裡的x,y都是5,則結果為 00005
學如逆水行舟,不進則退;心似平原跑馬,易放難收。
備戰藍橋杯 貪心演算法刷題整理2
題目描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
貪心演算法 藍橋杯
在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有 n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標 記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才能...
貪心演算法刷題
牛牛有乙個陣列array,牛牛可以每次選擇乙個連續的區間,讓區間的數都加1,他想知道把這個陣列變為嚴格單調遞增,最少需要操作多少次?嚴格遞增,我們應該讓某個數字後面的乙個比他小的連續區間都進行加1操作,然後遍歷整個陣列 除最後乙個數字 其實我們不需要真正的對陣列進行加1操作,只需要求出ai與ai 1...