• 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治


    1492: [NOI2007]货币兑换Cash

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 3396  Solved: 1434
    [Submit][Status][Discuss]

    Description

    小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下
    简称B券)。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波动,
    两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目。我们记录第 K 天中 A券 和 B券 的
    价值分别为 AK 和 BK(元/单位金券)。为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法
    。比例交易法分为两个方面:(a)卖出金券:顾客提供一个 [0,100] 内的实数 OP 作为卖出比例,其意义为:将
     OP% 的 A券和 OP% 的 B券 以当时的价值兑换为人民币;(b)买入金券:顾客支付 IP 元人民币,交易所将会兑
    换给用户总价值为 IP 的金券,并且,满足提供给顾客的A券和B券的比例在第 K 天恰好为 RateK;例如,假定接
    下来 3 天内的 Ak、Bk、RateK 的变化分别为:
    假定在第一天时,用户手中有 100元 人民币但是没有任何金券。用户可以执行以下的操作:
    注意到,同一天内可以进行多次操作。小Y是一个很有经济头脑的员工,通过较长时间的运作和行情测算,他已经
    知道了未来N天内的A券和B券的价值以及Rate。他还希望能够计算出来,如果开始时拥有S元钱,那么N天后最多能
    够获得多少元钱。

    Input

    输入第一行两个正整数N、S,分别表示小Y能预知的天数以及初始时拥有的钱数。接下来N行,第K行三个实数AK、B
    K、RateK,意义如题目中所述。对于100%的测试数据,满足:0<AK≤10;0<BK≤10;0<RateK≤100;MaxProfit≤1
    0^9。
    【提示】
    1.输入文件可能很大,请采用快速的读入方式。
    2.必然存在一种最优的买卖方案满足:
    每次买进操作使用完所有的人民币;
    每次卖出操作卖出所有的金券。

    Output

    只有一个实数MaxProfit,表示第N天的操作结束时能够获得的最大的金钱数目。答案保留3位小数。

    Sample Input

    3 100
    1 1 1
    1 2 2
    2 2 3

    Sample Output

    225.000

    HINT

    Source

    Solution

    斜率优化DP,典型的不单调

    $f[i]=max(f[i],f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i])$

    至于CDQ分治的理论:移步  折越

    启发:

    1.斜率优化DP变化万千..

    2.熟练掌握分治算法能够产生很多神奇的功效(xyx好像很喜欢分治)

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define maxn 200010
    struct DayNode
    {
        double A,B,Ra,k; int id;
        bool operator < (const DayNode & T) const
            {return k<T.k;}
    }a[maxn],tmpa[maxn];
    struct PointNode{double x,y;}p[maxn],tmpp[maxn];
    int N;
    double dp[maxn];
    int tmp1[maxn],tmp2[maxn],stack[maxn];
    #define inf 1e9
    #define eps 1e-9
    double slope(int l1,int l2)
    {
        if (!l1) return -inf;
        if (!l2) return inf;
        if (fabs(p[l1].x-p[l2].x)<=eps) return -inf;
        return (p[l1].y-p[l2].y)/(p[l1].x-p[l2].x);
    }
    void CDQ(int l,int r)
    {
        if (l==r)
            {
                dp[l]=max(dp[l],dp[l-1]);
                p[l].y=dp[l]/(a[l].Ra*a[l].A+a[l].B);
                p[l].x=a[l].Ra*p[l].y;
                return;
            }
        int mid=(l+r)>>1,L,R;
        L=l; R=mid+1;
        for (int i=l; i<=r; i++)
            if (a[i].id<=mid) tmpa[L++]=a[i]; else tmpa[R++]=a[i];
        for (int i=l; i<=r; i++) a[i]=tmpa[i];
        CDQ(l,mid);
        int top=0;
        for (int i=l; i<=mid; i++)
            {
                while (top>1 && slope(stack[top],stack[top-1])<slope(i,stack[top-1])+eps) top--;
                stack[++top]=i;
            }
        int Top=1;
        for (int i=r; i>=mid+1; i--)
            {
                while (Top<top && slope(stack[Top],stack[Top+1])+eps>a[i].k) Top++;
                dp[a[i].id]=max(dp[a[i].id],p[stack[Top]].x*a[i].A+p[stack[Top]].y*a[i].B);
            }
        CDQ(mid+1,r);
        L=l; R=mid+1;
        for (int i=l; i<=r; i++)
            if (((p[L].x<p[R].x+eps || (fabs(p[L].x-p[R].x)<=eps && p[L].y<p[R].y+eps)) || R>r) && L<=mid) 
                tmpp[i]=p[L++];
            else tmpp[i]=p[R++];
        for (int i=l; i<=r; i++) p[i]=tmpp[i];
    }
    int main()
    {
        scanf("%d%lf",&N,&dp[0]);
        for (int i=1; i<=N; i++) 
            scanf("%lf%lf%lf",&a[i].A,&a[i].B,&a[i].Ra),a[i].k=-a[i].A/a[i].B,a[i].id=i;
        sort(a+1,a+N+1);
        CDQ(1,N);
        //for (int i=1; i<=N; i++) printf("%d  %d  %.3lf  %.3lf  %.3lf  %.3lf  
    ",i,a[i].id,a[i].A,a[i].B,a[i].Ra,a[i].k);
        printf("%.3lf
    ",dp[N]);
        return 0;
    }
  • 相关阅读:
    一篇文章教会你在Windows和Linux系统下搭建Nginx
    【红日安全-VulnStack】ATT&CK实战系列——红队实战(二)
    绕过WAF进行常见Web漏洞利用
    Mac mysql 5.7.x 设置服务开机自启动
    Mac mysql 5.7启动报错,解决之道 The server quit without updating PID file
    阿里云Centos7 安装mysql5.7 报错:./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
    Python 反序列化漏洞学习笔记
    Jmeter二次开发——基于Java请求
    环境篇:Atlas2.1.0兼容CDH6.3.2部署
    synchronized 是王的后宫总管,线程是王妃
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5503333.html
Copyright © 2020-2023  润新知