/*
* Problem :: 2212 / 센서
*
* Kind :: Greedy
*
* Insight
* - DP 로 풀려고 했으나...
* max(N)=10^4 이니
* O(N^2) 로 풀면 시간제한내에 못 풀것 같다...
* + Greedy 로 풀어야 하나?
*
* - 일단 처음에 문제가 이해가 안되어서 애먹었다
* 질문에 나와 같은 사람이 있는 것을 보았고
* 그 답변으로 문제를 완벽하게 이해할 수 있었다
* + 예제 입력 1
* 6
* 2
* 1 6 9 3 6 7
* # 예제 출력 1
* 5
* -> 집중국의 수신 가능 영역
* [1, 3] [6, 9]
*
* - 위의 예제 입력에서 센서의 좌표를 정렬하면
* 1 3 6 6 7 9
* 인데... 집중국을 어떻게 놓지?
* + 각 센서간의 거리의 최소부터 더해서
* 최소 신장 트리를 만드는 식으로 하면 될까?
* 각 센서를 하나의 집합으로 해서 처음엔 N 개의 집합이 있고
* 연결해서 총 K 개의 집합이 남을 때까지 구하면 될 것 같다
* Union Find 알고리즘을 활용해보자
* # 그런데 센서의 자표의 연결이 실제로 트리도 아니고 배열로 이루어져 있어서
* i 번째면 i-1 번째 혹은 i+1 번째 센서랑 연결되어야 하는데
* Union Find 까지 활용해야 하나...? <= 좀 Too Much 아닐까?
* -> 1 3 6 6 7 9
* 여기서 각 센서간의 거리는
* 2 3 0 1 2
* 인데... 0 부터 1 2 2 3 이렇게 순서대로 더한다면...
* 최소 신장 트리를 만드는 관점에서는 더할 때마다 각 노드가 연결되는 거니까...
* 처음 N 개 집합에서 각 노드를 연결해 K 개의 집합을 만드려면
* N-K 번 더해야 한다!!!
* => 2 3 0 1 2
* 를 정렬해서
* 0 1 2 2 3
* 으로 만들고
* 앞의 원소부터 차례대로 N-K 원소까지 차례대로 더해주면 되겠다!
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
int K; cin >> K;
vector<int> P(N); /* 센서의 좌표를 저장한 Vector */
for (int i=0; i<N; i++)
cin >> P[i];
// Process
sort(P.begin(), P.end()); /* 센서의 좌표 오름차순으로 정렬 */
vector<int> D(N-1); /* 센서의 좌표간 거리를 저장한 Vector */
for (int i=0; i<N-1; i++) {
D[i] = P[i+1] - P[i];
}
sort(D.begin(), D.end()); /* 센서의 좌표간 거리를 오름차순으로 정렬 */
int ans = 0;
/* 센서의 좌표간 거리를 작은 것부터 순서대로 N-K 번째까지 더함 */
for (int i=0; i<N-K; i++) {
ans += D[i];
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */