演算法訓練 旅行家的預算
時間限制:1.0s 記憶體限制:256.0mb
問題描述
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離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
題目解析:
將起點想象成第 0 個加油站,終點想象成 n+1 個加油站
第 0 個加油站距離起點的距離為 0,第 n+1 加油站距離起點的距離為 d1
第 0 個加油站的**為 p,第 n+1 加油站的**為 0
根據油箱容量 c 和每公升汽油能能行駛的距離 d2 可以計算出油箱加滿油可以行駛的最大距離 maxdis
無解:(在輸入時就判斷,盡快找出無解情況)
如果兩個加油站的距離大於加滿油可以行駛的最大距離,那麼無解
有解:
1. 如果能找到了
(1)如果能一次加油到達,那麼加到剛好能到達便宜的加油站即可
(2)如果一次不能到達,那麼先將油箱加滿,到達行駛最大距離之前的那個加油站,再加到剛好行駛到的便宜那個加油站
2. 如果沒找到,則加滿油,行駛到最大距離之前的那個加油站,繼續尋找
注意:終點的加油站**為 0,所以最後一次加油加到剛好到達終點即可
示例**:
1 #include2 #include3using
namespace
std;45
#define max_num 100167
intmain()8
35}3637
if(!flag) //
無解 38
4243
/*44
i:當前加油站的編號
45j:下乙個比自己便宜的加油站的編號
46*/
47for (int i = 0, j; i <= n; i = j) //
到達j之後,將j賦值給i,重新迴圈,知道到達終點
4856
if (price[j] <= price[i]) //
找比現在所在的加油站便宜的加油站 57
60}6162
/*63
641 如果能找到了
65(1)如果能一次加油到達,那麼加到剛好能到達便宜的加油站即可
66(2)如果一次不能到達,那麼先將油箱加滿,到達行駛最大距離之前的那個加油站,再加到剛好行駛到的便宜那個加油站
672 如果沒找到,則加滿油,行駛到最大距離之前的那個加油站,繼續尋找
68*/
6970
if (price[j] <= price[i]) //
屬於(1)
7175
else
//屬於(2)或 2
7680}81
82 printf("
%.2lf\n
", total);
8384
return0;
85 }
藍橋杯 演算法訓練 ALGO12
問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3時,有...
藍橋杯 ALGO 83 演算法訓練 階乘
問題描述 乙個整數n的階乘可以寫成n 它表示從1到n這n個整數的乘積。階乘的增長速度非常快,例如,13 就已經比較大了,已經無法存放在乙個整型變數中 而35 就更大了,它已經無法存放在乙個浮點型變數中。因此,當n比較大時,去計算n 是非常困難的。幸運的是,在本題中,我們的任務不是去計算n 而是去計算...
藍橋杯 ALGO 33 演算法訓練 數列
演算法訓練 數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 30,31,30 31,32,30 32,...