Codevs 1046 旅行家的預算 貪心
阿新 • • 發佈:2017-12-02
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 旅行家的預算 貪心