caioj1064 DP

【问题描述】
今天6:00起床,我转身发现枕头边有100美元。
出门的时候发现门口有家冰淇淋店,拉了很长的横幅:“今天100美元和400马克互换”
第二天的横幅是:“今天100美元和300马克互换”
第三天的横幅是:“今天100美元和500马克互换”
第四天的横幅是:“今天100美元和300马克互换”
第五天的横幅是:“今天100美元和250马克互换”

第五天的晚上,我灵光一闪,决定坐时光飞机回到第一天的上午6:00,准备发大财!
我是这么做的:
Day 1 ... 用 100.0000 美元 换 400.0000 马克
晚上我手里拿着400.0000马克安心睡觉了

Day 2 ... 用 400.0000 马克 换 133.3333 美元
晚上我手里拿着133.3333美元安心睡觉了

Day 3 ... 用 133.3333 美元 换 666.6666 马克
晚上我手里拿着666.6666马克安心睡觉了

Day 4 ... 我手里拿着666.6666 马克 不换美元,因为我知道明天换更好呀
晚上我手里拿着666.6666马克安心睡觉了

Day 5 ... 用 666.6666 马克 换 266.6666 美元
晚上我手里拿着266.6666美元偷笑,我赚了166.6666美元。厉害吧?你有时光机吗?

第六天全世界都不使用马克了,所以最后一天留在手里的必须是美元!


【输入文件】
第一行是一个自然数N,1≤N≤100,表示天数。
接下来的N行中每行是一个自然数a[i],1≤a[i]≤1000。
表示预先知道的第i天100美元 和 A马克 能互换。
 
【输出文件】

一行,即最后一天晚上手里的美元数目(保留两位小数)。


记录每天最多在手里的美元数和马克数。

最后一天换成美元就好了。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[1001];
double f[1001][3];
int main()
{
	scanf("%d",&n);
	f[0][1]=100;
	f[0][2]=0;
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		f[i][1]=max(f[i-1][1],f[i-1][2]*100/a[i]);
		f[i][2]=max(f[i-1][2],f[i-1][1]*a[i]/100);
	}
	f[n][1]=max(f[n][1],f[n][2]*100/a[n]);
	printf("%.2lf",f[n][1]);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值