码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1492: [NOI2007]货币兑换Cash(待更新)

时间:2017-12-14 14:57:33      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:sizeof   转换   ++   a*   元组   names   人民币   多少   ret   

1D1D动态规划问题。网上的大多都说有三类,然而我觉得吧,就是两类,一类利用单调性和斜率优化可以解决的,主要是因为能证明单调性(斜率与二元组的横坐标同时满足单调性,实际上很多时候都不用列二元组,你搞斜率优化的时候看得出来吧)那不单调就只能这样搞了。

暴力。

/*
O(n^2)暴力DP,f表示这天有多少人民币,转移时就转换成券来求 
A表示A券价值,B表示B券价值,S表示这个券的数量 
 
题意得:A*Sa+B*Sb=F,Sa/Sb=R

(A*R+B)*Sb=F;

Sb=F/(A*R+B);  Sa=Sb*R;
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
double a[110000],b[110000],r[110000],f[110000];
int main()
{
    int n;
    memset(f,0,sizeof(f));
    scanf("%d%lf",&n,&f[0]);
    
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf%lf",&a[i],&b[i],&r[i]);
        
        f[i]=f[i-1];
        for(int j=i-1;j>=1;j--)
        {
            //劵->钱
            double Sa,Sb;//劵数 
            Sb=f[j]/(a[j]*r[j]+b[j]);
            Sa=Sb*r[j];
            
            f[i]=max(f[i],a[i]*Sa+b[i]*Sb);
        }
    }
    printf("%.3lf\n",f[n]);
    return 0;
}

 

bzoj1492: [NOI2007]货币兑换Cash(待更新)

标签:sizeof   转换   ++   a*   元组   names   人民币   多少   ret   

原文地址:http://www.cnblogs.com/AKCqhzdy/p/8037371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!