【CF739E】Gosha is hunting

· · 题解

题面

DP凸优化。

~~事实上我被卡精度了,震惊了。~~ code: ``` //2018.9.14 by ljz #include<bits/stdc++.h> using namespace std; #define res register int #define LL long long #define inf 0x3f3f3f3f #define eps 1e-15 inline int read(){ res s=0; bool w=0; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=1;ch=getchar();} while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); return w?-s:s; } inline void _swap(res &x,res &y){ x^=y^=x^=y; } inline int _abs(const res &x){ return x>0?x:-x; } inline int _max(const res &x,const res &y){ return x>y?x:y; } inline int _min(const res &x,const res &y){ return x<y?x:y; } const int N=2e3+10; #define lb long double namespace MAIN{ int n,a,b; lb dp[N],fp[N],fv[N],p[N],v[N]; inline void calc(lb x,lb y){ for(res i=1;i<=n;i++){ dp[i]=dp[i-1],fp[i]=fp[i-1],fv[i]=fv[i-1]; if(dp[i-1]+p[i]>dp[i]+x)dp[i]=dp[i-1]+p[i]-x,fp[i]=fp[i-1]+1,fv[i]=fv[i-1]; if(dp[i-1]+v[i]>dp[i]+y)dp[i]=dp[i-1]+v[i]-y,fv[i]=fv[i-1]+1,fp[i]=fp[i-1]; if(dp[i-1]+p[i]+v[i]-p[i]*v[i]>dp[i]+x+y)dp[i]=dp[i-1]+p[i]+v[i]-p[i]*v[i]-x-y,fp[i]=fp[i-1]+1,fv[i]=fv[i-1]+1; } } inline void MAIN(){ n=read(),a=read(),b=read(); for(res i=1;i<=n;i++)scanf("%Lf",&p[i]); for(res i=1;i<=n;i++)scanf("%Lf",&v[i]); lb l=0,r=1,L,R; while(r-l>eps){ lb mid=(l+r)/2; L=0,R=1; while(R-L>eps){ lb MID=(L+R)/2; calc(mid,MID); fv[n]>b?L=MID:R=MID; } calc(mid,R); fp[n]>a?l=mid:r=mid; } calc(r,R); printf("%.4Lf\n",dp[n]+a*r+b*R); } } int main(){ MAIN::MAIN(); return 0; } ```