<开学毒瘤赛>の题解(T4)
TO BE CONTINUED
注:最近较忙,只贴代码,详解请等待
正解:二分+DP
因为数据太水 咳咳... 某些玄学DP也能过
但是最近我加强了一波数据,所以玄学DP过不了第11个点
所以是这样的:
#include<iostream> #include<cstdio> using namespace std; int n,a[20001],mx[20001],mn[20001],ans; int check(int x) { mn[1]=mx[1]=a[1]; for(int i=2;i<=n;i++) mx[i]=min(a[i],a[1]-mn[i-1]),mn[i]=max(0,a[1]+a[i-1]+a[i]-mx[i-1]-x); if(!mn[n]) return 1; return 0; } int main() { int l=0,r=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),l=max(l,a[i]+a[i-1]); r=2*l+1; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans*3); return 0; }