萌新求助!!!大佬走过路过不要错过哦哦、(⊙o⊙)…
查看原帖
萌新求助!!!大佬走过路过不要错过哦哦、(⊙o⊙)…
752615
xiaozeyu110115楼主2022/11/14 19:40

这里直接上代码

#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;
}

看了好几遍都感觉没问题啊(╥╯^╰╥)

2022/11/14 19:40
加载中...