讨论 / 二分法,求解释
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.

看到某大牛的二分法,但很不理解,求解释。

查看更多回复
提交回复