Dashboard - Educational Codeforces Round 69 (Rated for Div. 2) - Codeforces http://codeforces.com/contest/1197
C
差分数组,先求出相邻差,再用大区间的和减去前k-1个较大的相邻差,求前面所有差的和
例如6 3 6个数,分成3个区间
4 8 15 16 23 42
设为a1,a2,a3,a4,a5,a6
a4-a1是区间[a1,a2,a3,a4]的最低成本,a4-a3+a3-a2+a2-a1,相邻差之和即为此区间的最低成本
前k-1个最大的相邻差是a6-a5,a5-a4,不取这两个相邻差,就将数组分开了,K个区间,需要K-1个间隔
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
int n,m,t,ans,vis[MAXN];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>vis[i];
}
vector<int>v;
for(int i=1;i<n;i++){//求相邻差
int temp=vis[i-1]-vis[i];
v.push_back(temp);
}
int ans=vis[n-1]-vis[0];//大区间的花费
sort(v.begin(),v.end());
for(int i=0;i<k-1;i++){
ans+=v[i];
}
cout<<ans<<endl;
return 0;
}