• 旅行家的預算-貪心
問題描述
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離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
思路:
本題事宜用貪心的思想解決,即每一步都要找到區域性最優解。
策略:① 我們首先討論那些沒有解決方案的,即只要任有兩個加油站的距離大於(汽車油箱的容量c * 每公升汽油能行駛的距離d2),那麼就是不能到達目的地的。
② 接下來就用while迴圈,當旅行家的走的路程等於d1時,退出,在迴圈中,我們先總是找出當前站點後面的最便宜的油價站點,然後結束的時候到達那個站點,如果後面的最便宜油價pmin(站點為ii)比之前的最便宜油價p還便宜,那麼我們直接加到油可以恰好到達站點ii的油,如果後面沒有比當前最便宜油價還便宜的站點,(1)在這個目前最便宜的站點,就算加滿油也無法到達終點,我們就直接加滿油(達到區域性最優,這是目前最優的策略,用最少的錢買油)(因為迴圈是從起始點油價開始的緣故,p永遠是現在最便宜的油價,而且每個迴圈,旅行家一定是在某個站點考慮這個問題,所以每次迴圈要結束了,就得將旅行家走的路程換成當前該站點的路程) (2)加滿油可以到達終點,直接加到剛好到達終點的油,然後退出
每次迴圈結束前都得將油量減去到達ii站點的油量,因為符合上面任何乙個條件的話,因為錢已經加了,所以旅行家已經到要去if要去的地方了。
每一次都要實現區域性最優,就算後面油價比現在的還貴,因為我一次性不能去終點,我只能先去後面最便宜的站點補給**
#include
#include
using
namespace std;
double d[10]
,pi[10]
;int
main()
double x = d2 * c;
//x為加滿油能走的最大路程
for(
int i =
1; i <= n; i++)}
int ii =0;
while
(d1 - d0)
//走到終點了,則d1 - d0等於0,退出迴圈}if
(pmin < p)
//如果途徑的油站的油價比這個站點(第一次是起始點的油價,後面會變)還便宜,那就在這個站點(不一定是起始點)
//加到使自己能剛好到達這個站點的油量
else
//後面途徑的油站油價都比目前最低油價的站點貴
else
//可以一次到達終點,那就加到剛好到終點的油
} l = l -
(d[ii]
- d0)
/ d2;
//走過多少路,就相應在油箱中減去多少,每次都消耗走到下乙個「最便宜」站點站點的油量
d0 = d[ii]
;//更新現在旅行家的移動到了哪,每乙個while迴圈旅行家一定會停在乙個油站,看看是否需要加油或者進行其他操作
p = pmin;
//更新當前的最低油價
pmin =
1000
;//變成乙個很大的值,方便之後比較
}printf
("%.2lf"
,pz)
;return0;
}
藍橋杯練習
k好數 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。輸入格式 ...
藍橋杯練習
題目完成時間2021年3月16日 題目 計算機真是最傻的東西 他都不能計算大於10 65 1的a b,請你幫這個 最傻 的東西過關,否則它就真的只認識1和0了。輸入格式 共兩行 第一行輸入乙個整數a 第一行輸入乙個整數b。輸出格式 共一行,乙個表示a b的整數。樣例輸入 2147483647 214...
藍橋杯 基礎練習
basic 1 閏年判斷 給定乙個年份,判斷這一年是不是閏年。當以下情況之一滿足時,這一年是閏年 年份是4的倍數而不是100的倍數 年份是400的倍數。include using namespace std intmain basic 2 01字串 對於長度為5位的乙個01串,每一位都可能是0或1,...