[POJ3639]Exchange Rates(dp)

来源:互联网 发布:范德堡大学 知乎 编辑:程序博客网 时间:2024/06/06 09:05

题目描述

传送门
题意:起初你有1000元加币,给出每天1美元到加币的兑换率,每兑换一次要付3%手续费,并且所有钱舍去美分后面的部分。问n天之后你最多有多少加币?

题解

这题的dp是非常简单的,设f(i,0/1)表示第i天最多有多少美元/加币,然后从f(i-1,?)递推就可以了。
不过刚开始还是因为精度的问题卡了一会,因为必须在比较大小的时候就砍位,否则会出错。

代码

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 1005int n;double rate,f[N][2];void clear(){    memset(f,0,sizeof(f));}double cut(double x){    int a=floor(x*100);    return (double)a/(100.0);}int main(){    while (~scanf("%d",&n))    {        if (!n) break;        clear();        f[0][0]=0,f[0][1]=1000.00;        for (int i=1;i<=n;++i)        {            scanf("%lf",&rate);            f[i][0]=max(f[i-1][0],cut(f[i-1][1]*0.97/rate));            f[i][1]=max(f[i-1][1],cut(f[i-1][0]*0.97*rate));        }        printf("%0.2lf\n",f[n][1]);    }}

总结

①有处理小数的题一定要关注精度问题!如果无缘无故地wa了一定要往这方面考虑!

0 0
原创粉丝点击