题解 | #最小花费#

最小花费

https://www.nowcoder.com/practice/e6df3e3005e34e2598b9b565cfe797c9

/*
这题,评论区的答案都没我写得好
*/
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

int L1, L2, L3, C1, C2, C3;
int a, b;
int n;
vector<int> dis(n);

int price(int a, int b) {
    int distance = dis[b] - dis[a];
    if (L2 < distance && distance <= L3) return C3;
    if (L1 < distance && distance <= L2) return C2;
    if (0 < distance && distance <= L1) return C1;
    return -1;
}

int main() {
    cin >> L1 >> L2 >> L3 >> C1 >> C2 >> C3;
    cin >> a >> b;
    cin >> n;
    dis.resize(n + 1);
    dis[1] = 0;
    for (int i = 2; i <= n; i++) {
        cin >> dis[i];//第i个站与i+1个站的距离
    }
    vector<int> dp(b + 1);
    dp[a] = 0;
    for (int i = a + 1; i <= b; i++) {
        dp[i] = INT_MAX;
        int k = i - 1;
        while (price(k, i) != -1 && k >= a) {
            dp[i] = dp[k] + price(k, i) < dp[i] ? dp[k] + price(k, i) : dp[i];
            k--;
        }
    }
    cout << dp[b] << endl;
}

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

dp[j]表示从起始站点上车,到j点下车的最低票价
dp[j]= min(dp[k]+price(k),...), 其中k为所有与j点距离小于L3的站点,price[k]表示从k到j点的花费


100 500 1000 100 450 800
3 86
100
468
865
1644
2556
3328
3607
4447
5430
5695
6626
7142
7973
8802
9523
9724
10046
10054
10955
11387
12032
12182
13078
13465
13850
13944
14630
15306
16104
17072
17662
17857
18412
18635
19217
19641
19655
19962
20961
21343
21687
21824
22502
23486
24241
24829
25824
26393
27251
27569
28451
29274
30025
30986
31526
32252
33224
33573
34404
34685
35563
36088
36176
36193
37077
37336
37847
37947
38595
38918
39476
39983
40332
40388
41014
41217
41577
42546
42646
42912
42949
43137
43180
43583
43805
44400
44892
45357
45471
46208
46938
47774
48157
49129
49638
49980
50741
50991
51961
52174


*/

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务