题解 P1016 【旅行家的预算】

思路是找在最大行驶距离内寻找比当前便宜的加油站然后判断是否能一次到达不能的话先加满然后一个一个判断直到剩下的油量不足到下一个加油站就加油,加适量。
具体分析到在注释里面    

#include <iostream>
#include <string>
using namespace std;
int main()
{
    double D1,C,D2,P;
    int N;
    cin>>D1>>C>>D2>>P>>N;
    double value = new double[N+1];//记录第i个加油站的价钱
    double over = new double[N+1]();//记录到第i个加油站的时候还可以走多少公里
    double way = new double[N+2];//记录第i个点离出发点的距离
    //初始化
     value[0] = P;
     way[0] = 0;
     double MAX = CD2;//记录能行驶距离
     bool flag = false;//判断是否无解
     for(int i = 1; i<=N; i++){
            cin>>way[i]>>value[i];
            if(way[i] - way[i-1]>MAX){
                flag = true;
            }
        }
        if(flag){
            cout<<"No Solution"<<endl;
            return 0;
        }
        way[N+1] = D1;//终点是最后一个加油站
        int i = 0;//记录当前到达的加油站
        int j = 1;// 记录向后找到的比自己便宜的加油站的编号
        double cost = 0;//记录费用
        while(i!=N+1){//直到终点才停止
        double s = 0;//记录到比自己便宜的加油站的距离
        while((s<=MAX)&&(j<=N)&&(value[i] <= value[j])){查//找比自己便宜的加油站
            j++;
            s = s + way[j] - way[j-1];
        }
        if(s<=MAX){//是否可以一步j加油站或不中途不加油到J
            if(over[i]>=way[j]-way[i]){//在i点加不加油
                over[j] = over[i]-way[j]+way[i];//在i点不加油因为够油到j点
            }else{//在i点加油到刚刚好到j点
                cost = cost + (way[j]-way[i]-over[i])/D2 value[i];
                over[j] = 0;//到j点时刚刚没油
            }
        }   else{//到不lJ或没有找到比当前便宜的点,即在当前加满油
            cost = cost + (MAX - over[i])/D2 value[i];
            j = i+1;
            over[j] = MAX - (way[j] - way[i]);//记录到下一个加油站的时候还可以走多远
        }
        i = j;
    }
    printf("%.2f",cost);//程序完美结束咔
    return 0;
}
原文地址:https://www.cnblogs.com/Sworddust/p/11427787.html