1 条题解

  • 0
    @ 2026-9-14 19:41:40
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        long long L;
        cin >> n >> L;
    
        vector<long long> h(n + 1), w(n + 1);
        for (int i = 1; i <= n; ++i) {
            cin >> h[i] >> w[i];
        }
    
        const long long INF = 4e18;
        vector<long long> dp(n + 1, INF);
        dp[0] = 0;
    
        for (int i = 1; i <= n; ++i) {
            long long maxh = 0, sumw = 0;
            // 枚举最后一层的左端点 j(第 j..i 本书在同一层)
            for (int j = i; j >= 1; --j) {
                sumw += w[j];
                if (sumw > L) break;
                maxh = max(maxh, h[j]);
                dp[i] = min(dp[i], dp[j - 1] + maxh);
            }
        }
    
        cout << dp[n] << '\n';
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    2078
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者