【洛谷 1016】 旅行家的预算

思路

贪心经典题。要把所有的加油站先排序,之后扫一遍,每一个加油站是否加油主要看从这个加油站开始,能走的路程里面是否存在一个比这个加油站便宜的:

  • 如果存在,找到第一个比他便宜的,加油加到这里;
  • 如果不存在,就把油加满,走到哪里算哪里。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef double db;
struct node{
    db dis, val;
    bool operator < (const node & a)const{
        return dis == a.dis ? val < a.val : dis < a.dis;
    }
};
node p[110];
db d1, c, d2, p1, max_dis = 0;
int n, t;
int main(){
    cin >> d1 >> c >> d2 >> p1 >> n;
    max_dis = c * d2;
    p[++t].dis = 0, p[t].val = p1;
    p[++t].dis = d1, p[t].val = 0;
    t ++;
    for(int i = 1; i <= n; i ++, t ++)
        cin >> p[t].dis >> p[t].val;
    t --;
    sort(p+1, p+1+t);
    db left = 0, cost = 0;
    for(int i = 1; i < t; i ++){
        int to = i, pos;
        db min_cost = p[i].val;
        left -= ((p[i].dis - p[i-1].dis) / d2);
        while(p[to+1].dis - p[i].dis <= max_dis){
            to ++;
            if(p[to].val < min_cost){
                min_cost = p[to].val;
                pos = to;
                break;
            }
        }
        if(to == i){
            printf("No Solution");
            return 0;
        }
        if(min_cost >= p[i].val){
            cost += (c-left) * p[i].val;
            left = c;
        }else if(left*d2 < p[pos].dis - p[i].dis){
            db tt = ((p[pos].dis - p[i].dis) / d2 - left);
            cost += tt * p[i].val;
            left += tt;
        }
    }
    printf("%.2f", cost);
    return 0;
}

光看初赛了,好久不写了,写的真丑。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值