题目描述
Dave以某种方法获取了未来几天美元对德国马克的兑换率。现在Dave只有100美元,请编写一个程序,使Dave通过几天的美元与德国马克的兑换后能得到最多的美元。
输入格式
第一行包含一个自然数n(1≤n≤100),表示Dave所知道的兑换率的天数。
后面跟着n个自然数A(100≤A≤1000)。第i+1行的数A表示第i天的兑换率。它告诉Dave在那天他能用100美元购买A马克,或用A马克购买100美元。
输出格式
只有一行,输出Dave经过n天的兑换后能得到的最多的美元值。结果保留两位小数。注意:Dave不一定每天都需要兑换。
说明:由于实数运算存在误差,结果在0.05的误差范围内将被认为是正确的。
输入样例
3
300
150
200
输出样例
200.00
题解
根据贪心的每次要么全部换完,要么不换,那我们分别记录第$i$天的美元最大值和马克最大值即可。
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #define MAXN 101 using namespace std; int n; double a[MAXN][2]; //[0] 美元 //[1] 马克 int main() { scanf("%d", &n); a[0][0] = 100; double tmp; for(register int i = 1; i <= n; i++) { scanf("%lf", &tmp); a[i][0] = max(a[i - 1][0], a[i - 1][1] * 100 / tmp); a[i][1] = max(a[i - 1][1], a[i - 1][0] * tmp / 100); } printf("%.2lf", a[n][0]); return 0; }