xingmingchao 2011-06-14 01:49:00
点我顶贴
收藏
删除
function min(a, b : longint) : longint;
begin
if a < b then min := a else min := b;
end;
function max(a, b : longint) : longint;
begin
if a > b then max := a else max := b;
end;
function check(m : longint) : boolean;
var
l, p, occupy, i : longint;
begin
check := false;
occupy := a[1];
for i := 2 to n do begin
l := m - a[i - 1];
p := a[1] - occupy;
if not odd(i) then
occupy := min(p, a[i])
else
occupy := max(0, a[i] - l + p);
end;
check := occupy = 0;
end;
procedure main;
var
m, l, r : longint;
begin
l := res; r := res * 2;
while l <= r do begin
m := (l + r) shr 1;
if check(m) then
r := m - 1
else l := m + 1;
end;
res := l;
end;
begin
getinfo;
if odd(n) then
main;
print;
end.
看到某大牛的二分法,但很不理解,求解释。