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