1573.下棋

題目描述

有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章