传送门

题意:不想写...


扔链接就跑

好吧我回来了

首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换

那么一定拿全利啊,一定比多天的组合好

$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();
}
DP-naive

相关文章: