• Educational Codeforces Round 69 (Rated for Div. 2) C


    Educational Codeforces Round 69 (Rated for Div. 2)

    C - Array Splitting

    You are given a sorted array a1,a2,…,an (for each index i>1 condition ai≥ai−1 holds) and an integer k.

    You are asked to divide this array into k non-empty consecutive subarrays. Every element in the array should be included in exactly one subarray.

    Let max(i) be equal to the maximum in the i-th subarray, and min(i) be equal to the minimum in the i-th subarray. The cost of division is equal to ∑i=1k(max(i)−min(i)). For example, if a=[2,4,5,5,8,11,19] and we divide it into 3 subarrays in the following way: [2,4],[5,5],[8,11,19], then the cost of division is equal to (4−2)+(5−5)+(19−8)=13.

    Calculate the minimum cost you can obtain by dividing the array a into k non-empty consecutive subarrays.

    Input

    The first line contains two integers n and k (1≤k≤n≤3⋅105).

    The second line contains n integers a1,a2,…,an (1≤ai≤109, ai≥ai−1).

    Output

    Print the minimum cost you can obtain by dividing the array a into k nonempty consecutive subarrays.

    Examples

    input

    6 3

    4 8 15 16 23 42

    output

    12

    input

    4 4

    1 3 3 7

    output

    0

    input

    8 1

    1 1 2 3 5 8 13 21

    output

    20

    Note

    In the first test we can divide array a in the following way: [4,8,15,16],[23],[42].

     

    题意:题意大概是 定义一个子数组代价为 数组里的最大值减去最小值,然后 给我们一个有序数组和一个k值,

    问 把这个数组分成k个子数组的最小的总价值。

    思路:先拿样例数组 【4 8 15 16 23 42】举例,

    首先当k等于1时,当前代价就是原数组的代价为 最大值减最小值 (42 - 4) = 38;

    当k等于2时,当前代价可以为 (8 - 4)+(42 - 15)= 31; 或者 (15 - 4)+(42 - 16)= 37 ...

    求 最小代价 列举之后 发现应该是 (23 - 4)+(42 - 42)= 19。

    这时候你可能发现了,当数组分成子数组时,有一段相邻元素的差值将不被算入代价,

    例如上面的例子最小值 19 就是 相邻元素 (23,42)的差值 19 未被算入 ,然后就是 38-19=19。

    然后拓展,k变大时,只需要去除k-1个相邻元素差值大的,就可以计算出最小代价,由此得解。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 #include<queue>
    10 using namespace std;
    11 #define ll long long 
    12 const int mod=1e9+7;
    13 const int inf=1e9+7;
    14  
    15 const int maxn=3e5+5;
    16 int num[maxn];
    17  
    18 int main()
    19 {
    20     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    21     int n,k;
    22     
    23     while(cin>>n>>k)
    24     {
    25         vector<int>v;
    26         ll int ans=0;
    27         int x;
    28         for(int i=0;i<n;i++)
    29         {
    30             cin>>num[i];
    31             
    32             if(i>0)
    33             {
    34                 x=num[i]-num[i-1];
    35                 ans+=x;//预处理 
    36                 v.push_back(x);
    37             }
    38         }
    39         
    40         sort(v.begin(),v.end(),greater<int>());//由大到小排序 
    41         k--;//去除k-1个相邻差值 
    42         
    43         for(int i=0;i<k;i++)
    44             ans-=v[i];
    45         
    46         cout<<ans<<endl;
    47     }
    48     
    49     return 0;
    50 }
    大佬见笑,,
  • 相关阅读:
    什么是mybatis
    Oracle存储过程、游标、函数
    Oracle事务、视图、序列
    异步发送表单数据到JavaBean,并响应JSON文本返回
    结果的转发和重定向
    在业务控制方法中收集List<JavaBean>参数
    在业务控制方法中收集数组参数
    在业务控制方法中写入包装User的模型来收集参数
    在业务控制方法中写入User,Admin多个模型收集参数
    Linux内核分析:实验八--Linux进程调度与切换
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/11240237.html
Copyright © 2020-2023  润新知