B. Tape

https://codeforces.com/contest/1110/problem/B

题意:给定n个坐标,现在要用最多k个长度覆盖所有的坐标,问长度最小是多少。

思路:求出所有segment的长度并排序,前k-1个segment单独使用长度为1的来覆盖,剩下的最后一个用来覆盖其他的所有segment。

总结:虽然其他的segment在位置上可能不是连续的区间,但是在用了k-1个数量的情况下,直接用他们计算出来的segment长度,是正确的,因为如果剩下的区间不相邻,他们计算出来的segment,说明已经有点在被包含在k-1个里面了,直接和这k-1个中的相邻点相连,不消耗数量。 初始时ans为k,因为考虑了k-1个1。

inline void solve() {
    int n, m, k;
    cin >> n >> m >> k;

    vector<int> a(n);
    for (auto& x : a) {
        cin >> x;
    }

    vector<int> seg;
    seg.reserve(n);
    for (int i = 1; i < n; ++i) {
        seg.push_back(a[i] - a[i - 1]);
    }
    sort(seg.begin(), seg.end());
    for (int i = 0; i < k - 1; ++i) {
        seg.pop_back();
    }

    long long ans = std::accumulate(seg.begin(), seg.end(), 0ll) + k;
    cout << ans << '\n';
}
posted @ 2026-01-04 10:01  _Yxc  阅读(7)  评论(0)    收藏  举报