1. 程式人生 > >Codevs 1046 旅行家的預算 貪心

Codevs 1046 旅行家的預算 貪心

name ++ space namespace return div lib pri 加油

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio> 
#include <queue>
using namespace std;

const int maxn = 100 + 30;
const int INF = 999999999;
double D1;          //兩地之間距離 D1 
double C,           //汽車容量  C 
       D2;          //每升汽油能行駛的距離 D2 
double P; //出發點汽油價格 double D[maxn]; //經過的加油站到起點的距離 double Px[maxn]; //經過的加油站的費用 double ans; //最後的價格 int N; //沿途加油站個數 double rest[maxn]; //剩余 void solve(); void input(); //輸入數據 void input() { cin >> D1 >> C >> D2 >> P >> N;
for (int i = 1; i <= N; i++) { cin >> D[i] >> Px[i]; rest[i] = C; } } void solve() { //輸入數據 input(); //一開始肯定要加汽油 D[N + 1] = D1; // 為了寫起來方便,將終點也認為是加油站, 離起點 D1距離 Px[N + 1] = INF; // 終點了嘛,所以需要價格 0
Px[0] = P; //起點處的 價格 rest[0] = C; //起點設置為 C int minx = 0; // minx: 當前價格最低的汽油站 for (int i = 1; i <= N+1; i++) { //接下來要前進的距離 double need = (D[i] - D[i - 1]) / D2; //接下來要前進的距離所需要的汽油量 if (need > C) { //所需要的汽油量 大於 最大的容量,顯然應該No Solution了 cout << "No Solution\n"; return; } //總是選擇當前價格最小的加油站 if (Px[minx] <= Px[i - 1]) { if (need <= rest[minx]) { rest[minx] -= need; ans += need * Px[minx]; } else { need -= rest[minx]; ans += rest[minx] * Px[minx]; minx = i - 1; //因為need > 當前最小價格的加油站,所以還需要加上前一個的加油站汽油 rest[minx] -= need; ans += need * Px[minx]; } } else { minx = i - 1; rest[minx] -= need; ans += need * Px[minx]; } } printf("%.2lf\n", ans); } int main() { solve(); return 0; }

Codevs 1046 旅行家的預算 貪心