白书上的题目
这里唯一要说一下的就是,二分答案不难想到,怎么构造答案的合理性非常值得注意
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var a,b,d:array[0..20010] of longint; 2 n,l,r,m,ans,i:longint; 3 4 function max(a,b:longint):longint; 5 begin 6 if a>b then exit(a) else exit(b); 7 end; 8 9 function min(a,b:longint):longint; 10 begin 11 if a>b then exit(b) else exit(a); 12 end; 13 14 function check(k:longint):boolean; 15 var x,y,i:longint; 16 begin 17 x:=a[1]; 18 y:=k-a[1]; 19 b[1]:=x; 20 d[1]:=0; 21 for i:=2 to n do 22 if i mod 2=1 then 23 begin 24 d[i]:=min(y-d[i-1],a[i]); 25 b[i]:=a[i]-d[i]; 26 end 27 else begin 28 b[i]:=min(x-b[i-1],a[i]); 29 d[i]:=a[i]-b[i]; 30 end; 31 if b[n]=0 then exit(true) else exit(false); 32 end; 33 34 begin 35 readln(n); 36 for i:=1 to n do 37 read(a[i]); 38 if n=1 then 39 begin 40 writeln(a[1]); 41 halt; 42 end; 43 a[n+1]:=a[1]; 44 for i:=1 to n do 45 l:=max(l,a[i]+a[i+1]); 46 if n mod 2=0 then writeln(l) 47 else begin 48 for i:=1 to n do 49 r:=max(r,a[i]*3); 50 ans:=r; 51 while l<=r do 52 begin 53 m:=(l+r) shr 1; 54 if check(m) then 55 begin 56 ans:=m; 57 r:=m-1; 58 end 59 else l:=m+1; 60 end; 61 writeln(ans); 62 end; 63 end.