首页 > 试题广场 >

(郊游活动)有 n 名同学参加学校组织的郊游活动,已知学校给

[填空题]
(郊游活动)有 n 名同学参加学校组织的郊游活动,已知学校给这 n 名同学的郊游总经费为 A 元,与此同时第 i 位同学自己携带了 Mi 元。为了方便郊游,活动地点提供 B(≥n)辆自行车供人租用,租用第 j 辆自行车的价格为 Cj元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。(第四、五空 2.5 分,其余 3 分)
本题采用二分法。对于区间[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. 

这道题你会答吗?花几分钟告诉大家答案吧!