有一道简单的pascal题 求标程

来源:百度知道 编辑:UC知道 时间:2024/05/11 13:52:32
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

思路:先将n个人的等级从小到大排序,然后求出相邻两数的差,然后把差从小到大排序,最后输出前k个差的和。
程序如下:
program chess;
var n,k,i,s:longint;a,b:packed array[1..100000] of longint;
procedure kp(l,r:longint);
var i,j,x,t:longint;
begin
i:=l;j:=r;x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then begin t:=a[i];a[i]:=a[j];a[j]:=t;inc(i);dec(j);end;
until i>j;
if i<r then kp(i,r);if l<j then kp(l,j);
end;
procedure kp2(l,r:longint);
var i,j,x,t:longint;
begin
i:=l;j:=r;x:=b[(l+r) div 2];
repeat
while b[i]<x do inc(i);
while b[j]>x do dec(j);
if i<=j then begin t:=b[i];b[i]:=b[j];b[j]:=t;inc(i);dec(j);end;
until i>j;
if i<r then kp2(i,r);if l<j then kp2(l,j);
end;
begin
readln(n,k);for i:=1 to n do read(a[i]);kp(1,n);
for i:=1 to n-1 do b[i]:=a[i+1]-a[i];kp2(1,n-1);
for i:=1 to k do