洛谷 P1626 象棋比賽

題目描述

有N我的要參加國際象棋比賽,該比賽要進行K場對弈。每一個人最多參加兩場對弈,最少參加零場對弈。每一個人都有一個與其餘人不相同的等級(用一個正整數來表示)。ios

在對弈中,等級高的人必須用黑色的棋子,等級低的人必須用白色的棋子。每一個人最多隻能用一次黑色的棋子和一次白色的棋子。爲增長比賽的可觀度,觀衆但願K場對弈中雙方的等級差的總和最小。spa

好比有7個選手,他們的等級分別是30,17,26,41,19,38,18,要進行3場比賽。最好的安排是選手2對選手7,選手7對選手5,選手6對選手4。此時等級差的總和等於(18-17)+(19-18)+(41-38)=5達到最小。code

輸入輸出格式

輸入格式:

 

第一行兩個正整數N,Kblog

接下來有N行,第i行表示第i+1我的等級。get

[數據規模]string

在90%的數據中,1≤N≤3000;it

在100%的數據中,1≤N≤100000;io

保證全部輸入數據中等級的值小於100000000,1≤K≤N-1。class

 

輸出格式:

 

在第一行輸出最小的等級差的總和。stream

 

輸入輸出樣例

輸入樣例#1: 複製
7 3
30
17
26
41
19
38
18
輸出樣例#1: 複製
5
思路:貪心
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans;
int num[100001];
struct nond{
    int l,r,dis;
}v[100001];
bool cmp(nond a,nond b){
    return a.dis<b.dis;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    sort(num+1,num+1+n);
    for(int i=1;i<n;i++){
        v[i].l=num[i];
        v[i].r=num[i+1];
        v[i].dis=num[i+1]-num[i];        
    }
    sort(v+1,v+1+n-1,cmp);
    for(int i=1;i<=m;i++)
        ans+=v[i].dis;
    cout<<ans;
}
相關文章
相關標籤/搜索