题解 P4409 【[ZJOI2006]皇帝的烦恼】
posted on 2019-06-10 12:55:48 | under 题解 | 编辑 | 0这题怎么没有pascal题解啊qaq
那蒟蒻就发一篇吧
感觉这是道恶评题(应该只有黄吧)
如dalao所说,这题就是一个二分,因为有单调性,所以可以直接二分答案,然后再判断答案是否可行即可。
用b[i]表示第i个数与第一个数最多可以相同多少个,c[i]表示第i个数与第一个数至少相同多少个,所以只要判断c[n]是否为0即可
代码:
uses math; var a,b,c:array[0..100005] of int64;//小心longint不够存哦(虽然这题似乎不会) i,j,n,ll,rr,mid:longint; function check(mid:longint):boolean; var i:longint; begin for i:=2 to n do begin b[i]:=min(a[i],a[1]-c[i-1]); c[i]:=max(0,a[1]+a[i-1]-b[i-1]+a[i]-mid); end; if c[n]=0 then exit(true) else exit(false); end;//验证答案是否可行 begin readln(n); for i:=1 to n do begin read(a[i]); ll:=max(ll,a[i]+a[i-1]); end; b[1]:=a[1]; c[1]:=b[1]; rr:=300000;//rr代表查找上界,ll代表查找下界 while ll<=rr do begin mid:=(ll+rr)>>1;//>>1相当于/2,但>>1更快 if check(mid) then rr:=mid-1 else ll:=mid+1;//更新上下界 end;//二分答案 writeln(ll); end.