Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting (思维)

时间:2023-03-10 04:51:16
Educational Codeforces Round 69 (Rated for Div. 2)  C. Array Splitting  (思维)

Educational Codeforces Round 69 (Rated for Div. 2)  C. Array Splitting  (思维)

  • 题意:给你一个长度为\(n\)的升序序列,将这个序列分成\(k\)段,每一段的值为最大值和最小值的差,求\(k\)段值的最小和.

  • 题解:其实每一段的最大值和最小值的差,其实就是这段元素的差分和,因为是升序,我们可以先求出差分数组,然后再对差分数组排序,因为我们可以分成\(k\)段,所以会有\(k-1\)个断开的'缝隙',也就是说两个段之间的差分是不用贡献给答案的,所以我们直接取前\(n-k+1\)个差分和就可以了.

  • 代码:

    int n,k;
    int a[N];
    int c[N]; int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;++i) cin>>a[i]; for(int i=2;i<=n;++i) c[i-1]=a[i]-a[i-1]; sort(c+1,c+n); int ans=0;
    for(int i=1;i<n-k+1;++i) ans+=c[i]; cout<<ans<<endl; return 0;
    }