資源限制 時間限制: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 采用貪心法,每次都加滿油,到地方如果更便宜,則將剩下的油換為便宜的油 代碼:
1 #include <iostream> 2 #include <vector> 3 #include <iomanip> 4 using namespace std; 5 //zq 6 int main() { 7 double D1,C,D2,P,sum=0,tank; 8 int N,flag=1; 9 vector<double>Di,Pi; 10 cin>>D1>>C>>D2>>P>>N; 11 tank=C; 12 Di.push_back(0); 13 Pi.push_back(P); 14 for (int i=1; i<=N; ++i) { 15 double tmpD,tmpP; 16 cin>>tmpD>>tmpP; 17 Di.push_back(tmpD); 18 Pi.push_back(tmpP); 19 } 20 Di.push_back(D1); 21 Pi.push_back(0); 22 double p0 = Pi[0]; 23 sum += tank * Pi[0]; 24 double distance,need; 25 for (int i=1; i<N+2; ++i) { 26 distance = Di[i] - Di[i-1]; 27 need = distance /D2; 28 if (tank * D2 >= distance) { 29 tank -= need; 30 if (Pi[i] < p0) { 31 sum -= tank * p0; 32 tank = C; 33 sum += tank * Pi[i]; 34 p0 = Pi[i]; 35 } else{ 36 if (tank * D2 < (Di[i+1] - Di[i])) { 37 sum += (C-tank)*Pi[i]; 38 tank = C; 39 p0 = Pi[i]; 40 } 41 } 42 } else{ 43 cout<<"No Solution"<<endl; 44 flag = 0; 45 break; 46 } 47 } 48 if (flag!=0) { 49 cout<<fixed<<setprecision(2)<<sum; 50 } 51 return 0; 52 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59713.html
標籤:C++
上一篇:十六進制轉換
