Ngày chủ nhật, Minh có rất nhiều dự định muốn hoàn thành chẳng hạn như làm bài tập môn toán, viết dàn bài môn vă,... Mỗi công việc đều có thời gian và lý tưởng để bắt đầu và kết thúc của nó. Tuy nhiên có 1 số công việc không thể cùng hoàn thành bởi công việc trước chưa kết thúc công việc sau đã bắt đầu Hãy lập trình giúp Minh tìm ra đươkc số công việc có thể hoàn thành nhiều nhất mỗi khi ngày chủ nhật tới. Dữ liệu nhập - Dòng đầu ghi số nguyên n (1<=n<=1000) - n dòng tiếp theo mỗi dòng ghi 2 số là thời gian bắt đầu và thời gian kết thúc của công việc thứ i ( mỗi số cách nhau 1 khoảng trắng) Dữ liệu xuất - Số công việc bạn Minh có thể hoàn thành nhiều nhất khi mỗi ngày chủ nhật tới. VD SAPXEPCV.INP SAPXEPCV.OUT 5 4 8 10 9 11 10 12 14 15 17 18 PASCAL HELPP

1 câu trả lời

uses crt, math;
type int = longint;
type bool = boolean;

// Lâu lâu nhái c++ tí :))
type pair = record
    first, second: int;
end;

operator < (a, b: pair) r: bool;
begin
    r:=(a.second <= b.first);
end;

operator <= (a, b: pair) r: bool;
begin
    r:=(a.first <= b.first);
end;

procedure swap(var a, b: pair);
var t: pair;
begin
    t:=a; a:=b; b:=t;
end;

var i, j, n, res: int;
    a: array[0..1000] of pair;
    dp: array[0..1000] of int;

procedure sort(l, r: int);
var i, j: int;
    x: pair;
begin
    i:=l; j:=r; x:=a[(l + r) shr 1];
    repeat
        while a[i] <= x do inc(i);
        while x <= a[j] do dec(j);
        if i <= j then begin
            swap(a[i], a[j]);
            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);
    
    for i:=1 to n do readln(a[i].first, a[i].second);
    sort(1, n);
    
    for i:=1 to n do begin
        dp[i]:=1;
        for j:=1 to i - 1 do begin
            if a[j] < a[i] then dp[i]:=max(dp[i], dp[j] + 1);
        end;
        res:=max(res, dp[i]);
    end;
    writeln(res);
readln;
end.