1145. 【贪心算法】美元汇率

题目描述

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

输入

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

输出

输出第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数)。
注意:考虑到实数算术运算中进位的误差,结果在正确结果0.05美元范围内的被认为是正确的,戴维必须在最后一天结束之前将他的钱都换成美元。

样例输入 
5
400
300
500
300
250
样例输出 
266.66
提示

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 美元

这道题为dp:

满足最优子结构(每天最优则最后最优)

无后效性(后一天只需根据前一天的美元或马克兑换)

决策:

每一天手中的钱只有两种情况:

从前一天直接继承或者兑换钱

所以只要选择其中更优的一种即可

code:

#include <bits/stdc++.h>
using namespace std;
int n,i,a;
double d[110]={0,100},m[110];
//d数组存储美元,m数组存储马克
int main() 
{	scanf("%d",&n);//输入天数
	cin>>m[1];//第一天的兑换值
	for(i=2;i<=n;i++){//循环天数
		scanf("%d",&a);
		d[i]=max(d[i-1],m[i-1]*100.0/a);
        //最优美元就是前一天的美元和由前一天马克兑换后的美元中较大值
        m[i]=max(m[i-1],d[i-1]*a/100.0);
        //最优马克就是前一天马克的和由前一天美元兑换后的马克中较大值
	}printf("%.2lf",d[n]);//输出第n天最大美元值
  	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值