1 条题解
-
0
文字教学
这道题用贪心算法解决,核心思路是“先盖所有连续区间,再在最大的空隙处断开以节省木板长度”:
- 先将有牛的牛棚编号排序,方便计算连续区间和空隙。
- 初始用1块木板盖住从第一个到最后一个有牛的牛棚,计算初始总长度。
- 计算每两个相邻有牛的牛棚之间的空隙(空牛棚数量),将空隙从大到小排序。
- 每多1块木板,就可以在1个最大的空隙处断开(不盖这个空隙),从而减少总长度。最多用m块木板,就减去前(m-1)个最大的空隙。
代码
#include <bits/stdc++.h> using namespace std; int a[205], b[205]; int main() { int m, s, c, ans, cnt = 0; cin >> m >> s >> c; for (int i = 0; i < c; ++i) cin >> a[i]; // 排序牛棚编号 for (int i = 0; i < c - 1; ++i) for (int j = 0; j < c - 1 - i; ++j) if (a[j] > a[j + 1]) swap(a[j], a[j + 1]); ans = a[c - 1] - a[0] + 1; // 计算相邻空隙 for (int i = 1; i < c; ++i) b[cnt++] = a[i] - a[i - 1] - 1; // 空隙从大到小排序 for (int i = 0; i < cnt - 1; ++i) for (int j = 0; j < cnt - 1 - i; ++j) if (b[j] < b[j + 1]) swap(b[j], b[j + 1]); // 减去前m-1个最大空隙 for (int i = 0; i < m - 1 && i < cnt; ++i) ans -= b[i]; cout << ans << endl; return 0; }
- 1
信息
- ID
- 209
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 16
- 已通过
- 5
- 上传者
京公网安备 11011102002149号