pat 甲级 1033 To Fill or Not to Fill

本文介绍了一种使用贪心思想解决的编程问题,涉及在给定条件下计算从初始位置到最远可达加油站的最少油费。通过比较沿途加油站的价格和行驶距离,确定最优加油策略。
摘要由CSDN通过智能技术生成

这道题用贪心的思想。分两种情况讨论。到一个加油站时需要考虑以下情况。

1.在未来可到达的加油站中,有更便宜的价格。则只需要加到能行驶到最便宜的加油站的油后在加油

2.在未来可到达的加油站中,没有比当前便宜的价格,则在当前站将油加满,行驶到最便宜的加油站去考虑下一步怎么做。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int c_max,d,distance_avg,total;
struct gas{
    double price,d;
    bool operator<(const gas& a) const{ //重载运算符,按照距离从小到大排序
        return d<a.d;
    }
}gas[510];
int main(){
    cin>>c_max>>d>>distance_avg>>total;
    for(int i=0;i<total;i++){
        cin>>gas[i].price>>gas[i].d;
    }
    gas[total]={0,(double)d};
    sort(gas,gas+total+1);
    if(gas[0].d){  //如果出发点没有加油站,则无法到达。因为tank初始为空
        printf("The maximum travel distance = 0.00");
        return 0;
    }
    double sum=0,oil=0;
    for(int i=0;i<total;){
        int k=-1;
        for(int j=i+1;j<=total&&gas[j].d-gas[i].d<=c_max*distance_avg;j++){//遍历可到达的加油站寻找是否有更便宜的
            if(gas[j].price<gas[i].price){//有更便宜的
                k=j;
                break;
            }
            else if(k==-1||gas[j].price<gas[k].price)//没有比当前加油站更便宜的,则选择该路段最小的
                k=j;
        }
        if(k==-1){//在油耗尽无法到达下一个加油站
            printf("The maximum travel distance = %.2lf\n",gas[i].d+c_max*distance_avg);
            return 0;
        }
        else if(gas[k].price<=gas[i].price){//有更便宜的,则行驶到便宜的加油站加油
            sum+=((gas[k].d-gas[i].d)/distance_avg-oil)*gas[i].price;//行驶到便宜的加油站需要的油费,即总共所需要的油减去油箱还有的油 * 油费
            i=k;
            oil=0;//行驶到加油站,油耗尽
        }
        else{//没有更便宜的,油加满
            sum+=(c_max-oil)*gas[i].price; //油加慢的费用
            oil=c_max-(gas[k].d-gas[i].d)/distance_avg;//行驶到该加油站所消耗的油
            i=k;
        }
    }
    printf("%.2lf\n",sum);
    return 0;
}

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值