题目链接

在[1,m]区间中,有n个点,要用k个木棍去覆盖完这个点,问最短覆盖长度 
起始点和终点间的距离,然后将不需要的一些覆盖减去
使得最后剩下的区间还剩k个即可 

/*
在[1,m]区间中,有n个点,要用k个木棍去覆盖完这个点,问最短覆盖长度
起始点和终点间的距离,然后将不需要的一些覆盖减去
使得最后剩下的区间还剩k个即可
*/
#include <bits/stdc++.h>
#define ll long long
#define Max 100005
using namespace std;
int n,m,k,a[Max];
//priority_queue< int ,vector<int>,greater<int> > q;// min->max
priority_queue< int ,vector<int>,less<int> > q;//max->min
//与 priority_queue<int> q;等价 max->min
int main()
{
int len;
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i];
len=a[n]-a[1]+1;
while(!q.empty()) q.pop();
for(int i=2;i<=n;i++)
{
int d=a[i]-a[i-1]-1;//点点之间的距离不含点
q.push(d);
}
// while(!q.empty())
// {
// cout<<"***: "<<q.top()<<endl;
// q.pop();
// }
// cout<<"*** : "<<q.size()<<endl;
int cnt=1;//代表一个整区间(段数)
while(cnt<k)
{
// cout<<"q..."<<q.top()<<endl;
len-=q.top();
q.pop();
cnt++;//减去一段区间,段数 ++
}
cout<<len<<endl;
return 0;
}