Nam có n viên gạch được đánh số từ 1 đến n. Các viên gạch có độ cứng lần lượt là a1,a2,...,an. Một viên gạch có độ cứng x nghĩa là Nam có thể chồng lên trên viên gạch đó tối đa x viên gạch khác, nếu chồng nhiều hơn thì viên gạch đó bị vỡ. Hỏi Nam có thể sắp được chồng gạch cao nhất là bao nhiêu? Dữ liệu vào: Dòng đầu tiên là số nguyên n (1≤ n ≤100) là số viên gạch. Dòng tiếp theo gồm n số nguyên a1,a2,,...,an (0≤ ai ≤100) mỗi số cách nhau một khoảng trắng. Dữ liệu xuất: Là số nguyên xác định chiều cao cao nhất của chồng gạch mà Nam sắp được. Ví dụ: CHONGGACH.INP CHONGGACH.OUT 3 3 1 2 1

2 câu trả lời

var
  n, i, d, j, tmp: integer;
  a: array[1..100005] of integer;
begin
  read(n);
  for i := 1 to n do read(a[i]);
  
  for i := 1 to n-1 do
    for j := i + 1 to n do
      if a[i] > a[j] then
      begin
        tmp := a[i];
        a[i] := a[j];
        a[j] := tmp;
      end;
  
  d := 0;
  for i := 1 to n do
    if d <= a[i] then
      d := d + 1;
  
  writeln(d);
end.

var i, n, res: longint;
    a: array[0..100] of longint;

procedure sort(l, r: longint);
var i, j, x, t: longint;
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
    readln(n);
    for i:=1 to n do read(a[i]);
    sort(1, n); // *Giảm dần*
    
    i:=2; res:=a[1] + 1;
    while (i <= n) and (i <= res) do begin
        if a[i] + i < res then res:=a[i] + i;
        inc(i);
    end;
    if res > n then write(n) else write(res);
end.