description
有N个人要参加国际象棋比赛,该比赛要进行K场对弈。
每个人最多参加两场对弈,最少参加零场对弈。
每个人都有一个与其他人都不相同的等级(用一个正整数来表示)。
在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。
每一个人最多只能用一次黑色的棋子和一次白色的棋子。为了增加比赛的可观度,观众希望K场对弈中双方的等级
差的总和最小。
比如有7个选手,他们的等级分别是30; 17; 26; 41; 19; 38; 18,要进行3场比赛。最好的安排是Player 2 vs Player 7, Player
7 vs Player 5 , Player 6 vs Player 4,此时等级差的总和等于(18 ¡ 17) + (19 ¡ 18) + (41 ¡ 38) = 5达到最小。
analysis
- 先排个序,把两两之差再排个序
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define O3 __attribute__((optimize("-O3")))
using namespace std;
ll a[MAXN];
ll n,k,ans;
O3 inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
O3 int main()
{
n=read(),k=read();
fo(i,0,n-1)a[i]=read();
sort(a,a+n);
fd(i,n-1,1)a[i]-=a[i-1];
sort(a+1,a+n);
fo(i,1,k)ans+=a[i];
printf("%lld\n",ans);
return 0;
}