八中oj 洛谷
這題太複雜了,能否全a看資料。。。
很好的一道模擬貪心題
演算法原理(優先順序)如下:
1.列舉途中經過的加油站,每經過乙個加油站,計算一次花費
2.在乙個加油站所需要加的油,就是能夠支援它到達下乙個油價比它低的加油站的量;
3.如果在這個加油站即使加滿油,都不能到達乙個比它油價低的加油站,(1)就把油箱加滿,前往能夠到達的加油站中油價最低的那個;(2)或者直接到終點;
4.如果在這個加油站即使加滿油,都不能到達任意乙個加油站,也不能到達終點城市,說明無解;
貪心思路就是這樣,能否實現看本事
#include
#include
#include
using
namespace std;
double d1,c,d2,n,p1,lc,ans;
struct liua[
105]
;int
main()
if(bh==0)
else
}else
} ans+
=(a[bh]
.d-i)
*yq/d2,i=a[bh]
.d,yq=a[bh]
.p;}
}printf
("%.2lf"
,ans);}
}
錯因:
1.未考慮是否省錢
2.不是選的最近的油站,而是選最便宜的
3.未考慮剩餘油
樣例輸入:
475.6 11.9 27.4 14.98 6
102.0 9.99
220.0 13.29
256.3 14.79
275.0 10.29
277.6 11.29
381.8 10.09
樣例輸出:
192.15
真實輸出:
192.32
於是我權衡了網上思路,進行第二次嘗試
#include
#include
#include
using
namespace std;
double d1,c,d2,n,p1,lc,ans,yx;
struct liua[
10005];
intmain()
}if(bh!=
0) ans+=(
(a[bh]
.d-i)
*yq-yx)
/d2,i=a[bh]
.d,yq=a[bh]
.p,yx=0;
//剩餘油不可能直接使到達
//不能找到,分為能否直接到達終點以及有無後續加油站兩方面同時考慮
else
//無後續加油站且無法直接到達終點
if(bh==
0&&t//能直接到達,最划算
if(t>=d1)
break;}
//不能直接到達但有後續加油站,先加滿(省錢),記錄剩餘油的多少
//加滿和到最便宜的地方是關鍵
else}}
printf
("%.2lf"
,ans)
;}
寫得算完整了,歡迎打臉質疑我
仔細品味兩次找油站!第一次是省錢且最近,第二次只是最便宜
貪心 旅行家的預算
問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離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,油站i離出發點的距離d i 每公升汽油 p i 計算結果四捨五入至小數點後兩位。如果無法到達目的地...