[codevs1046]旅行家的预算

本文介绍了一个基于贪心策略的算法实现,用于解决在已知各加油站位置及油价的情况下,从起点行驶到终点所需的最低加油费用问题。通过记录当前最便宜的加油站并在沿途按需加油的方式,确保总花费最小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目←

瞎贪心……
记录当前为止最便宜的加油站minx
因为每一站油量最多为C,所以在当前站没加满的情况下,每走到一条新路优先加单价最小的加油站
要是加满的话,直接跳到目前的加油站
加满了油还走不到下一站就是非法情况了……(废话)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 200000 + 50;
double D,C,D2,P1;
double P[MAXN],pos[MAXN],ans;
int n,now = 0,minx = 1061109567;
double sy[MAXN];
int main(){
    scanf("%lf%lf%lf%lf",&D,&C,&D2,&P1);
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++){
        scanf("%lf%lf",&pos[i],&P[i]);
        sy[i] = C;
    }
    sy[0] = C;
    P[0] = P1;
    pos[n + 1] = D;
    P[n + 1] = 1061109567;
    minx = 0;
    for(int i = 1;i <= n + 1;i ++){
        double need = (pos[i] - pos[i - 1])/D2;
        if(need > C){
            printf("No Solution");
            return 0;
        }
        if(P[minx] <= P[i - 1]){
            if(need <= sy[minx]){
                sy[minx] -= need;
                ans += need*P[minx];
            }
            else{
                need -= sy[minx];
                ans += sy[minx]*P[minx];
                minx = i - 1;
                sy[minx] -= need;
                ans += need*P[minx];
            }
        }
        else{
            minx = i - 1;
            sy[minx] -= need;
            ans += need*P[minx];
        }
    }
    printf("%.2lf",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值