白书上的题目

这里唯一要说一下的就是,二分答案不难想到,怎么构造答案的合理性非常值得注意

 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.
View Code

 

posted on 2014-10-17 20:56  acphile  阅读(156)  评论(0编辑  收藏  举报