象棋比赛

【题目描述】
有 N 个人要参加国际象棋比赛,该比赛要进行 K 场对弈。
每个人最多参加两场对弈,最少参加零场对弈。
每个人都有一个与其他人不相同的等级(用一个正整数来表示)。
在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。
每人最多只能用一次黑色的棋子和一次白色的棋子。
为了增加比赛的可观度,观众希望 K 场对弈中双方的等级差的总和最小。
比如有 7 个选手,他们的等级分别是 30;17;26;41;19;38;18,要进行 3 场比
赛。最好的安排是 Player2 vs Player7,Player7 vs Player5,Player6 vs Player4 ,此时等级
差的总和等于(18-17)+(19-18)+(41-38)=5 达到最小。
【输入文件】
第一行两个正整数 N,K;
接下来有 N 行,第 i 行表示第 i+1 个人等级。
【输出文件】
在第一行输出最小的等级差的总和。
【样例输入】
7 3
30
17
26
41
19
38
18
【样例输出】

5
【数据规模】
在 90%的数据中,1<=N<=3000;
在 100%的数据中,1<=N<=100000;
保证所有输入数据中等级的值小于 10 8, 1<=k<=N-1.

按等级排序,一个点只会与相邻的两个点比赛

所以把差排序,取前k个的和

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long lol;
 7 lol n,k,a[100001],s[100001],ans,num;
 8 int main()
 9 {int i;
10   cin>>n>>k;
11   for (i=1;i<=n;i++)
12     {
13       scanf("%lld",&a[i]);
14     }
15   sort(a+1,a+n+1);
16   for (i=1;i<=n;i++)
17     {
18       if (i>1)
19     {
20       num++;
21       s[num]=a[i]-a[i-1];
22     }
23     }
24   sort(s+1,s+num+1);
25   for (i=1;i<=k;i++)
26     ans+=s[i];
27   cout<<ans;
28 }

 

posted @ 2017-11-02 21:42  Z-Y-Y-S  阅读(274)  评论(0编辑  收藏  举报