题目
Daniel 正在玩一个战棋游戏。
现在Daniel 有n 队士兵站在x 轴上。第i 队士兵有ai人,坐标为xi。
Daniel 看到一队士兵有这么多人,都站在同一个位置,他对此很不满意。他想命令一些士兵移动到新的位置(必须是整点),使得不存在两个士兵站在同一个位置。
为了节约时间,Daniel 希望每个士兵的移动距离的最大值尽可能小。请求出这个最小值。
题解
最大值的最小值,最小值的最大值,二分答案
二分答案很简单,关键是怎么判断答案正误
设答案为m,则所有士兵都应在【x1-d,xn+d】的区间内。每队士兵都判断能否在区间内找到位置
最后k
代码
var
n,i,j,k,d,c,l,r,m:longint;
a,x:array[1..100000]of longint;
function dis(m:longint):boolean;
var
i,j,k:longint;
begin
k:=x[1]-m;
for i:=1 to n do
begin
if k>x[i] then if k-x[i]+a[i]-1>m then exit(false) else k:=k+a[i] else
if x[i]-k<=m then k:=k+a[i] else
k:=x[i]-(a[i] div 2);
end;
if k-1>x[i]+m then exit(false) else exit(true);
end;
begin
assign(input,'distinct.in');
assign(output,'distinct.out');
reset(input);rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i]);
if a[i]>r then r:=a[i];
end;
for i:=1 to n do read(x[i]);
l:=r div 2;
while l<r do
begin
m:=(l+r) div 2;
if dis(m) then r:=m else l:=m+1;
end;
writeln(r);
close(input);close(output);
end.