您的位置:首页 > 编程语言 > C语言/C++

象棋比赛问题(排序/C++)

2015-07-30 17:31 639 查看

象棋比赛Chess

【问题描述】有N个人要参加国际象棋比赛,该比赛要进行K场对弈。每个人最多参加两场对弈,最少参加零场对弈。每个人都有一个与他人都不相同的等级(用一个正整数来表示)。

   在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。 每个人最多只能用一次黑色的棋子和一次白色的棋子。

   为了增加比赛的客观度,观众希望K场对弈中双方等级差的总和最小。比如有7个选手,他们的等级分别是30,17,26,41,19,38,18,要进行3场比赛,最好的安排是 2 vs 7, 7 vs 5,6 vs 4,此时等级差的总和为(18-17)+(19-18)+(41-38)=5 达到最小。

【输入格式】

   第一行两个整数N、K。接下来N行,第i行表示第i-1个人等级。

【输出格式】

   最小等级差的总和

【输入样例】

7  3

30

17

26

41

19

38

18

【输出样例】

5

【数据范围】

90% N<=3000

100% N<=100000

所有等级值<110  1<=K<=N-1

此题唯一的价值就是做两次排序,对于C++来说,简直没任何价值。代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int lev[100001];
int cha[100000];

int main()
{
int n,k;
cin >> n;
cin >> k;
int i;
for(i=1;i<=n;i++)
{
cin >> lev[i];
}
sort(lev+1,lev+n+1);
for(i=1;i<n;i++)
{
cha[i]=lev[i+1]-lev[i];
}
sort(cha+1,cha+n);
int ans=0;
for(i=1;i<=k;i++)
{
ans+=cha[i];
}
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: