题解 | 空间跃迁

空间跃迁

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

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, k;
    cin >> n >> k;
    
    vector<long long> a(n);  // a[1..n-1]有效,a[0] unused
    for (int i = 1; i <= n-1; ++i) {
        cin >> a[i];
    }
    
    // 前缀和数组:prefix[i] = a[1] + a[2] + ... + a[i]
    vector<long long> prefix(n, 0);
    for (int i = 1; i <= n-1; ++i) {
        prefix[i] = prefix[i-1] + a[i];
    }
    
    long long total = prefix[n-1];  // 不使用跃迁的总耗时
    long long max_save = 0;
    
    for (int i = 1; i <= n; ++i) {
        // 计算向左跃迁的节省
        int left = max(1, i - k);
        if (left < i) {  // 跃迁后位置在左侧,有节省
            long long save = prefix[i-1] - prefix[left-1];
            max_save = max(max_save, save);
        }
        
        // 计算向右跃迁的节省
        int right = min(n, i + k);
        if (right > i) {  // 跃迁后位置在右侧,有节省
            long long save = prefix[right-1] - prefix[i-1];
            max_save = max(max_save, save);
        }
    }
    
    cout << total - max_save << endl;
    
    return 0;
}

全部评论

相关推荐

码农索隆:以下是我以我微薄的认知提供的建议: 1.考个教师资格证,去当体育考试。 2.去健身房当健身教练(因为在我印象里面体育生身材都不错)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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