Năm nay có n thành phố đăng kí tổ chức các trận đấu bóng đá trong khuôn khổ giải HSSV toàn quốc. Thành phố thứ i (1 ≤ i ≤ n) có độ cao so với mặt nước biển là h[i] (1 ≤ h[i] ≤ 1.000.000.000). Ban tổ chức muốn chọn ra k thành phố tổ chức thi đấu sao cho độ lêch độ cao giữa thành phố có độ cao lớn nhất và thành phố có độ cao nhỏ nhất là ít nhất. Yêu cầu: Viết chương trình tính độ lệch ít nhất có thể chọn được. Dữ liệu vào: từ tệp văn bản CHONTP.INP gồm hai dòng: • Dòng đầu ghi số hai nguyên dương n và k; • Dòng thứ hai ghi lần lượt h[1], h[2], …, h[n] cách nhau ít nhất một dấu cách. Kết quả: ghi ra tệp văn bản CHONTP.OUT giá trị độ lệch ít nhất có thể chọn được. Ví dụ: CHONTP.INP CHONTP.OUT 5 3 2 1 2 5 6 3 Ràng buộc: • Có 60 % test 1 ≤ n ≤ 1.000 tương ứng 60 % số điểm; Có 40 % test 10.000 ≤ n ≤ 100.000 tương ứng 40 % số điểm.

1 câu trả lời

uses crt;
type int = longint;
var a: array[0..10000] of int;
    i, n, k: longint;
    res: int = trunc(1e9);

procedure minimize(var res: int; x: longint);
begin
    if res > x then res:=x;
end;

procedure sort(l, r: longint);
var i, j: longint;
    x, t: int;
begin
    i:=l; j:=r; x:=a[(l + r) shr 1];
    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 sort(i, r);
    if l < j then sort(l, j);
end;

begin
    clrscr;
    readln(n, k);
    for i:=1 to n do read(a[i]);
    sort(1, n);
    
    for i:=1 to n - k + 1 do 
        minimize(res, a[i + k - 1] - a[i]);
    writeln(res);
readln;
end.