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 a(n);
for (auto& x : a) {
cin >> x;
}

vector 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  阅读(24)  评论(0)    收藏  举报