1. 程式人生 > >美元匯率

美元匯率

題目描述

在以後的若干天裡戴維將學習美元與德國馬克的匯率。編寫程式幫助戴維何時應買或賣馬克或美元,使他從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 ;
}