備戰藍橋杯 貪心演算法刷題整理4

2021-10-09 05:06:55 字數 1747 閱讀 4355

題目描述:

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離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...