本题采用二分法。对于区间[l, r],我们取中间点 mid 并判断租用到自行车的人数能否达到 mid。判断的过程是利用贪心算法实现的。
const maxn = 1000000; type arr = array[1..MAXN] of longint; var n, B, A, l, r, ans, mid, i : longint; M, C : arr; function check(nn : longint) : boolean; var count, i, j : longint; begin count := 0; i := 1; j := 1; while i <= n do begin if 2 then inc(count, C[j] - M[i]); inc(i); inc(j); end; exit( 3 ); end; procedure sort(var a : arr; l : longint; r : longint); var i, j, x, y : longint; begin i := l; j := r; x := a[(l + r) div 2]; while i <= j do begin while a[i] < x do inc(i); while a[j] > x do dec(j); if i <= j then begin y := a[i]; a[i] := a[j]; a[j] := y; inc(i); dec(j); end; end; if i < r then sort(a, i, r); if l < j then sort(a, l, j); end; begin read(n, B, A); for i := 1 to n do read(M[i]); for i := 1 to B do read(C[i]); sort(M, 1, n); sort(C, 1, B); l := 0; r := n; while l <= r do begin mid := (l + r) div 2; if 4 then begin ans := mid; l := mid + 1; end else r := 5; end; writeln(ans); end.
