bug:不小心用int去存了一个double的数据结果死活过不了
#include <bits/stdc++.h>
using namespace std;
// typedef long long ll;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * f;
}
int n;
double res, d1, c, d2, p, sum, len, a[10][2];
int f(int now) {
int low = 0; //可到达的最低价格油站
double low_p = 1000;
for (int i = now + 1; i <= n; ++i) {
//判断能不能去
if ((a[i][0] - a[now][0]) <= len) {
//价格低,所以要去
if (a[i][1] < a[now][1]) {
//花费的钱
sum += (a[i][0] - a[now][0] - res) / d2 * a[now][1];
res = 0;
return i;
}
//记录第二选择站点
else if (a[i][1] < low_p) {
low = i;
low_p = a[i][1];
}
} else {
break;
}
}
//判断是否一定要走到终点还是走第二站点
if ((d1 - a[now][0]) <= len) {
//可以走终点
//花费的钱
sum += (d1 - a[now][0] - res) / d2 * a[now][1];
return 0;
}
//无法走到终点,只能走第二站点
else if (low != 0) {
//到第二站点剩余油能跑多远
res = len - (a[low][0] - a[now][0]);
//花费的钱
sum += c * a[now][1];
return low;
} else {
//无法走到任何下一个站点
return -1;
}
}
int main() {
cin >> d1 >> c >> d2 >> p >> n;
a[0][0] = 0, a[0][1] = p; // 0是距离,1是油价
for (int i = 1; i <= n; ++i) {
cin >> a[i][0] >> a[i][1];
}
len = d2 * c;
int k = 0;
while (1) {
k = f(k);
if (k == 0) {
printf("%.2lf", sum);
break;
} else if (k == -1) {
cout << "No Solution" << endl;
break;
}
}
return 0;
}