题解 | To Fill or Not to Fill

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

double dp[30005];

struct station {
    double price;
    int dis;
};

bool cmp(station a, station b) {
    return a.dis < b.dis;
}
int main() {
    int Cmax, D, Davg, N;
    while (cin >> Cmax >> D >> Davg >> N) { // 注意 while 处理多个 case
        for (int i = 0; i <= D; i++) dp[i] = INT_MAX;
        int maxlen = Cmax * Davg;

        vector<station> v;
        while (N--) {
            station tmp;
            cin >> tmp.price >> tmp.dis;
            v.push_back(tmp);
        }
        sort(v.begin(), v.end(), cmp);
        for (int i = 0; i < v.size(); i++) {
            int start = v[i].dis;
            double price = v[i].price;
            for (int j = 1; j <= maxlen; j++) {
                dp[start + j] = min(dp[start + j], price);
            }
        }
        double price = 0;
        int flg = 1;
        for (int i = 1; i <= D; i++) {
            if (dp[i] == INT_MAX) 
            {
                flg = 0;
                cout <<"The maximum travel distance = "<<
                fixed<<setprecision(2)<< (i - 1)*1.0 << endl;
                break;
            }
            price+=dp[i];
        }
        if(flg) cout<<fixed<<setprecision(2)<<price/Davg<<endl;

    }
}
// 64 位输出请用 printf("%lld")

很有区间合并的感觉

用dp[i]记录每单位最佳油耗即可,累加[1,D]的dp[i]即可获得最终耗费

全部评论

相关推荐

11-23 15:33
已编辑
门头沟学院 Java
CUTMR:换账号试试重启推荐算法,我换账号之后回复率还不错,约莫有个20%左右的消息回复率,前几页、主动招呼的HR也开始符合我期望薪资,此前的大号从招呼、回复、前几页的岗位薪资在涨幅30%+以上 用着用着聊着聊着就变成-20%,而且我开通会员之后直接0面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务