题意:不想写...
好吧我回来了
首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换
那么一定拿全利啊,一定比多天的组合好
$f[i]$表示第$i$天最多能得到的钱在这一天可以换成多少$A$卷
枚举使用哪一天留下的卷,按这一天的汇率换成钱来更新最大钱数
再用这个钱数更新$f[i]$
这样是$O(n^2)$的
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef long long ll; const int N=1e5+5,M=1e4+5; const double eps=1e-9; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n,s; double a[N],b[N],r[N]; double f[N]; void dp(){ f[1]=s*r[1]/(a[1]*r[1]+b[1]); double t=s; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++) t=max(t,f[j]*a[i]+f[j]/r[j]*b[i]); f[i]=max(f[i],t*r[i]/(a[i]*r[i]+b[i])); } printf("%.3lf",t); } int main(){ freopen("in","r",stdin); n=read();s=read(); for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&a[i],&b[i],&r[i]); dp(); }