To fill or Not to Fill

实现每一次转移均花费最少,并累加到这个最少的费用。
1.每到达一个加油站就寻找下一个最优的加油站k,并计算转移到它的费用。
2.如果当前加油站费用最低:就加满,计算加油费用和到达后剩余的油。到达k。
如果当前加油站费用不是最低:
(1)油够,转移费用为0,计算到达后剩余的油。到达k。
(2)不够,加正好到达k的油,计算加油费用,到达k,油为0,

#include<bits/stdc++.h>
using namespace std;

const int INF=INT_MAX;
const int Max=510;

struct station {
    double p;
    double d;
    bool operator <(const station & a) {
        return d<a.d;
    }
} s[Max];

int main() {
    ios::sync_with_stdio(0);
    int n;
    double CMax,D,Davg;
    cin>>CMax>>D>>Davg>>n;
    for(int i=0; i<n; i++) {
        cin>>s[i].p>>s[i].d;
    }
    s[n].p=0;
    s[n].d=D;
    sort(s,s+n);
    if(s[0].d!=0) {
        cout<<"The maximum travel distance = 0.00"<<endl;
    } else {
        int now=0;
        double tank=0,sum=0;
        while(now<n) {
            int k=-1;
            double minprice=INF;
            for(int i=now+1; i<=n&&s[i].d-s[now].d<=CMax*Davg; i++) {
                if(minprice>s[i].p) {
                    minprice=s[i].p;
                    k=i;
                    if(minprice<s[now].p) {
                        break;
                    }
                }
            }
            if(k==-1) break;
            double need=(s[k].d-s[now].d)/Davg;
            if(minprice<s[now].p) {
                if(tank<need) {
                    sum+=(need-tank)*s[now].p;
                    tank=0;
                } else {
                    tank-=need;
                }
            } else {
                sum+=(CMax-tank)*s[now].p;
                tank=CMax-need;
            }
            now=k;
        }
        if(now==n) {
            printf("%.2f\n",sum);
        } else {
            printf("The maximum travel distance = %.2f\n",s[now].d+CMax*Davg);
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Version 1.7 ----------- - ADD: Delphi/CBuilder 10.2 Tokyo now supported. - ADD: Delphi/CBuilder 10.1 Berlin now supported. - ADD: Delphi/CBuilder 10 Seattle now supported. - ADD: Delphi/CBuilder XE8 now supported. - ADD: Delphi/CBuilder XE7 now supported. - ADD: Delphi/CBuilder XE6 now supported. - ADD: Delphi/CBuilder XE5 now supported. - ADD: Delphi/CBuilder XE4 now supported. - ADD: Delphi/CBuilder XE3 now supported. - ADD: Delphi/CBuilder XE2 now supported. - ADD: Delphi/CBuilder XE now supported. - ADD: Delphi/CBuilder 2010 now supported. - ADD: Delphi/CBuilder 2009 now supported. - ADD: New demo project FlexCADImport. - FIX: The height of the TFlexRegularPolygon object incorrectly changes with its rotation. - FIX: Added division by zero protect in method TFlexControl.MovePathSegment. - FIX: The background beyond docuemnt wasn't filled when TFlexPanel.DocClipping=True. - FIX: In "Windows ClearType" font rendering mode (OS Windows mode) the "garbage" pixels can appear from the right and from the bottom sides of the painted rectangle of the TFlexText object. - FIX: The result rectangle incorrectly calculated in the TFlexText.GetRefreshRect method. - FIX: Added FPaintCache.rcPaint cleanup in the TFlexPanel.WMPaint method. Now it is possible to define is the drawing take place via WMPaint or via the PaintTo direct call (if rcPaint contain non-empty rectangle then WMPaint in progress). - FIX: The TFlexPanel.FPaintCache field moved in the protected class section. Added rcPaint field in FPaintCache that represents drawing rectangle. - ADD: In the text prcise mode (TFlexText.Precise=True) takes into account the rotation angle (TFlexText.Angle). - FIX: Removed FG_NEWTEXTROTATE directive (the TFlexText Precise mode should be used instead). - FIX: The TFlexRegularPolygon object clones incorrectly drawed in case when TFlexRegularPolygon have alternative brush (gradient, texture). - ADD: Add TFlexPanel.InvalidateControl virtual method which calls from TFle

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值