25pts求调
查看原帖
25pts求调
633466
LiaoYF1楼主2022/7/8 19:14

换了一个贪心策略WA1,3,4,写了注释

#include<iostream>
using namespace std;
double d1,c,d2,a,max_d,ans=0;//a:剩余油量,max_d:最远距离,其他与题目中一致
double p[10],d[10];/*d:每个油站距离 p:每个油站油价*/
int n;
void move(int now){
    if(now==n){//到达
        printf("%.2lf",ans);
        return;
    }
    int nxt=-1,max_x=-1;
    for(int i=now+1;i<=n;i++){//找下一个比当前油价低的油站
        if(p[i]<p[now]){
            nxt=i;
            break;
        }
    }
    if(nxt!=-1){//找到了
        ans+=((d[nxt]-d[now])/d2-a)*p[now];//加到刚好能到
        a=0;
        //cout<<nxt<<endl;
        move(nxt);
    }else{//没找到
        int minn=600,minx=-1;
        for(int i=now+1;i<=n;i++){//找后面能到达的最便宜油站
            if(d[i]-d[now]>max_d){
                break;
            }
            if(p[i]<minn){
                minn=p[i];
                minx=i;
            }
        }
        if(minx=-1){//没有可以到达的油站
            cout<<"No Solution";
            return;
        }
        ans+=(c-a)*p[now];//加满油
        a=(d[max_x]-d[now])/d2;//计算剩余油量
        //cout<<max_x<<endl;
        move(max_x);
    }
}
int main(){
    cin>>d1>>c>>d2>>p[0]>>n;//0号油站为起点
    d[0]=0;
    for(int i=1;i<=n;i++){
        cin>>d[i]>>p[i];
    }
    max_d=c*d2;//计算最远距离
    for(int i=0;i<=n;i++){//手写冒泡(没用结构体)
        for(int j=i;j<=n;j++){
            if(d[j]<d[i]){
                swap(d[j],d[i]);
                swap(p[j],p[i]);
            }
        }
    }
    move(0);
    return 0;
}

记录

2022/7/8 19:14
加载中...