这里直接上代码
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
//ios::sync_with_stdio(false);
float D1,C,D2,P,temd,m,temp,temc;//tem皆为临时费用、油量、地点
int N;
cin >> D1 >> C >> D2 >> P >> N;
float Di[N+1],Pi[N+1];
for(int i = 0; i < N;i++){
cin >> Di[i] >> Pi[i];
}
Di[N] = D1;//手动赋值终点
Pi[N] = 0;
//单独考虑没有加油站的情况
if((N==0 && C * D2 < D1) || (C * D2 < Di[0])){
cout << "No Solution";
return 0;
}
if(N == 0 && C * D2 >= D1){
m = D1 / D2 * P;
cout << setiosflags(ios::fixed) << setprecision(2) << m << endl;
return 0;
}
//
temp = P;
m = 0;
temd = 0;
temc = 0;
for(int i = 0; i < N+2;i++){
if(temp > Pi[i] & C * D2 >= (Di[i] - temd)){//寻找后面比目前地点花费少的地点
m += ((Di[i] - temd) / D2 - temc) * temp;//花费=(下一花费最少的加油站离起点的距离 - 上一地点离起点的距离)/ 每升公里数 - 剩余油量
temd = Di[i];//更新地点、费用
temp = Pi[i];
temc = 0;//设计走到此地点正好用完油(因为后面的油价便宜,前面尽量少用,多用便宜的油)
}
else if(temp > Pi[i] & C * D2 < (Di[i] - temd)){ //如果找到更便宜的地点,即使加满油也走不到,实行这种方案
for(int j = i - 1; j > 0; j--){ //从到达不了的地点往前找加满油能到的那个地点
temc = C;//在上一地点加满油,因为后面的油贵,便宜的到达不了,中转站的油也贵,尽量少用
if(C * D2 >= (Di[j] - temd)){ //找到中转站
m += C * temp;//结算油费,有一部分油没用完也在这里结算,因后面临时油费更新为中转站的油费,而这时临时油费还是上一地点的
temc = C - (Di[j] - temd) / D2;//剩余油量
temd = Di[j];
temp = Pi[j];
i = j;//更新地点为中转站的地点
break;
}
}
}
}
cout << setiosflags(ios::fixed) << setprecision(2) << m << endl;
return 0;
}
看了好几遍都感觉没问题啊(╥╯^╰╥)