题意:给定有牛的牛棚,要把所有这些牛棚用数量有限的木板挡住,要怎么挡所用的木板的长度最小
思路
发现: 首先有牛的牛棚一定要挡
挡了之后要长度最小,那就把木板数量用到极致,用得越多,链接的越少,长度就越短,但是注意满足所有牛都挡住之后不应该再有更多木板,即木板最多用给的那个的牛的数量
怎么用木板? 发现既然有牛的棚都必须要有木板,那么要长度最小,就从相邻的牛棚里找最近的,连接起来省掉一块木板,这样增加的长度最小——属于贪心,每次找最近
即思路为:先把牛都分别用上木板,找最近的合并,省去木板,一直到木板满足约束
正着找很难,不如逆转一下,先盖住牛,再减木板
实现
用小根堆做
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
using namespace std;
const int N = 210;
int c[N];
int n, s, C;
priority_queue<int, vector<int>, greater<int>> q;
int main()
{
cin >> n >> s >> C;
for(int i = 1; i <= C; i ++)
{
cin >> c[i];
}
sort(c + 1, c + C + 1);
//int cnt = 0;
for(int i = 2; i <= C; i ++)
{
//cnt ++;
if(c[i] - c[i-1] > 1)
q.push(c[i] - c[i-1] - 1);
}
int ans = C;
// cout << q.size();
// cout << n;
while((int)q.size() - n + 1 > 0)
{
ans += q.top();
q.pop();
}
cout << ans << endl;
return 0;
}