美元汇率

题目描述

在以后的若干天里戴维将学习美元与德国马克的汇率。编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。

输入输出格式

输入格式:

输入文件的第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数。

接下来的N行中每行是一个自然数A,1≤A≤1000。第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。

输出格式:

输出文件的第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数)。

注意:考虑到实数算术运算中进位的误差,结果在正确结果0.05美元范围内的被认为是正确的,戴维必须在最后一天结束之前将他的钱都换成美元。

输入输出样例

输入样例#1: 复制

5
400
300
500
300
250

输出样例#1: 复制

266.67
Day 1 ... changing 100.0000 美元= 400.0000 马克
Day 2 ... changing 400.0000 马克= 133.3333 美元
Day 3 ... changing 133.3333 美元= 666.6666 马克
Day 5 ... changing 666.6666 马克= 266.6666 美元

贪心加动态规划 。 在汇率换算哪里有点不会换 ,数学太弱了。。。

一开始有 100美元

每一行的A 表示 100美元可以买A马克  , A马克也可以买100美元  ;
500
100美元可以买 500 马克 (1马克 0.2美元 ), 500马克可以买100美元 (1美元 5 马克)

           


    dp[i][0 ] = 表示第i天  美元的最大收益
    dp[i][1]  = 表示第i天  马克的最大收益
    

    dp[1][0] = 第一天美元收益 100 ,
    dp[1][1] = 400
    dp[2][0] = 第二天美元收益取决于第一天 当前汇率是 300 ,第一天如果没有换马克,( dp[1][0]) ,如果换成了马克,(dp[1][1] /a[i] )*100  

    dp[1][0] = 100  ;
    dp[1][1] = 400 ;
    dp[i][0] = max(dp[i-1][0] , (dp[i-1][1]/a[i] )*100 )
    dp[i][1] = max(dp[i-1][1] , dp[i-1][0] *a[i] /100)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
const int MAX =  1000005  ;
double dp[MAX][2]  ;
int a[MAX] ;
int main()
{
    int n  ;
    cin >> n ;
    for(int i = 1 ; i<=n ;i++)
    {
        cin >>a[i] ;
    }
    dp[1][0] = 100 ;  // 第一天美元的收益
    dp[1][1] = a[1] ;   // 第一天马克的收益
    for(int i = 2 ; i<=n ; i++)
    {
        dp[i][0] = max(dp[i-1][0] ,(dp[i-1][1]/a[i])*100 );
        dp[i][1] = max(dp[i-1][1] , dp[i-1][0]*a[i] /100) ;
    }
    printf("%.2f",max(dp[n][0],(dp[n-1][1]/a[n] )*100));

    return 0 ;
}

猜你喜欢

转载自blog.csdn.net/qq_41661809/article/details/84402901
今日推荐