題目描述
有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; }