題目描述
有N 個人要參加國際象棋比賽,該比賽要進行K場對弈。每個人最多參加兩場對弈,最少參加零場對弈。每個人都有一個與其他人都不相同的等級(用一個正整數來表示)。
在對弈中,等級高的人必須用黑色的棋子,等級低的人必須用白色的棋子。每一個人最多隻能用一次黑色的棋子和一次白色的棋子。爲了增加比賽的可觀度,觀衆希望K場對弈中雙方的等級差的總和最小。
比如有7個選手,他們的等級分別是30, 17, 26, 41, 19, 38, 18要進行3場比賽。最好的安排是Player 2 vs Player 7, Player7 vs Player 5 , Player 6 vs Player 4,此時等級差的總和等於(18-17) + (19-18) + (41-38) = 5達到最小。
輸入
第一行兩個正整數N ,K。
接下來有N 行,第i行表示第i . 1個人等級。
輸出
在第一行輸出最小的等級差的總和。
數據範圍限制
在90%的數據中,1 ≤ N ≤ 3000
在100%的數據中,1 ≤ N ≤ 100000
保證所以輸入數據中等級的值小於108 ,1 ≤ K ≤ N-1
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int vis[100010];
int set[100010];
int main()
{
//freopen("chess.in","r",stdin);
//freopen("chess.out","w",stdout);
int n,k;
cin >> n;
cin >> k;
int i;
for(i = 1;i <= n;i++)
cin >> vis[i];
sort(vis + 1,vis + n + 1);
for(i = 1;i < n;i++)
set[i] = vis[i + 1] - vis[i];
sort(set + 1,set + n);
int ans = 0;
for(i =1 ;i <= k;i++)
ans += set[i];
cout << ans;
return 0;
}