乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n(0<=n<=100),油站i離出發點的距離di、每公升汽油**pi(i=1,2,……n)。計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。
第1行:乙個資料,表示最少費用
copy(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)
275.6 11.9 27.4 2.8 2
1 102.0 2.9
2 220.0 2.2
26.95
【解】
1,因為要到達目的地且油箱容量和每公升油可行路程一定,所以當路途中的兩個加油站間路程大於油箱最大可行路程時,無解。(no solution)
2,在已經行駛過的加油站中,選擇**最優者(且剩餘可加油量不為0)盡量加滿(同一**可加油量最多為油箱容量),並維護當前**的剩餘可加油量。(優先佇列維護)
3,在當前**最優的剩餘可加油量不足以支援其到達下乙個加油站點時,先加滿當前**的剩餘可加油量(並應去掉此**的可選方案),再選擇剩下**中的最優,直到油箱中的油足夠支援其走到下一加油站點。
4,到達新的加油站點時,因為其**可能影響後面路程油價的方案選擇,所以應將其生成一種新的可選方案以備選用,並維護其油價及其可加油量(初始時為油箱容量)
第乙份(20160701)
#include//優先佇列:加油站油價低為最優
#include#include#includeusing namespace std;
struct node
}gas[110];
bool cmp(node a,node b)
sort(gas,gas+n+1,cmp);
gas[0].jrn=0.0;gas[0].all=c;//初始化
gas[n+1].unit=0x3f3f3f3f;gas[n+1].jrn=d1;
n++;//終點路程需加入
q.push(gas[0]);//起點看作乙個加油站先行放入
node last;
double now,al;//now:從上乙個加油站點為走到當前站點的所需油量,al:已加油需要花費的**
for(i=1,al=0.0;i<=n;i++,al=0.0)
while(!q.empty())
else if(last.all==now)
else
}ans+=al;
q.push(gas[i]);
}printf("%.2lf\n",ans);
}
第二份(20200116)#include#include#include#include#includeusing namespace std;
const int maxn = 500 + 5;
int n;
double d1, c, d2, p0, d, ans, vlm;
pairg[maxn];
int main()
if(g[p].first > g[i].first + d)
if(g[p].second >= g[i].second)
else
}printf("%.2lf\n", ans);
return 0;
}
NOIP1999 旅行家的預算
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n 0 n 100 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入至小數...
NOIP 1999 旅行家的預算
題目描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入...
NOIP1999 旅行家的預算
1046 旅行家的預算 1999年noip全國聯賽普及組noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 題目描述 description 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油...