在长度为 s 的排成一行的牛棚中,有 n 个需要被木板覆盖,但是只有 m 块任意长度的木板,最小化所需木板总长度
贪心,先将 n 个需要覆盖的牛棚用一块木板覆盖,这样的话其中比存在覆盖了多余的一些空白区域,然后按从大到小的顺序依次删除 m 个空白,就得到了答案。正确性显然,要总的最小,就把最大的 m 个删掉。
还有一种动态规划的算法,没有想到,但是 nocow 的题解上有写,可以借鉴一下。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 205;
int n, m, s, a[MAX_N], b[MAX_N];
void init()
{
scanf("%d%d%d", &m, &s, &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
}
inline bool cmp(int a, int b)
{
return a > b;
}
void doit()
{
sort(a + 1, a + n + 1);
for(int i = 1; i <= n - 1; i ++)
b[i] = a[i + 1] - a[i] - 1;
sort(b + 1, b + n, cmp);
int ans = a[n] - a[1] + 1;
for(int i = 1; i < m; i ++)
ans -= b[i];
printf("%d\n", ans);
}
int main()
{
freopen("barn1.in", "r", stdin);
freopen("barn1.out", "w", stdout);
init(); doit();
return 0;
}