标签:需要 出发点 ace 加油站 min 贪心 input div std
#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;
}
标签:需要 出发点 ace 加油站 min 贪心 input div std
原文地址:http://www.cnblogs.com/douzujun/p/7944663.html