1 条题解

  • 0
    @ 2097-10-2 11:17:31

    【例28.3】 数列分段

    解题思路

    正整数段贪心:当前段只要还能加入下一个数就加入;若加入会超过 m,则从该数开新段。

    正确性说明

    任意合法第一段不能比贪心第一段更长,否则和会超限。把某最优方案的第一段延长到贪心边界不会增加剩余所需段数;对余下序列归纳,贪心段数最少。

    易错点

    等于 m 可以继续属于当前段;每个 a_i 保证不超过 m。

    复杂度

    时间 O(n),空间 O(1)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n, m;
        cin >> n >> m;
        int segments = 1, sum = 0;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (sum + x > m) {
                segments++;
                sum = x;
            } else
                sum += x;
        }
        cout << segments << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    193
    时间
    1000ms
    内存
    128MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者