题目传送门
思路:
-
输入处理:
- 首先读取一个整数
N
,表示戴维学习汇率的天数。 - 然后读取
N
个整数,每个整数表示每一天的汇率A
,即100美元可以兑换的马克数。
- 首先读取一个整数
-
初始化变量:
- 初始化两个变量
a
和b
,分别表示持有美元和马克的最大价值。初始时,a
为100美元,b
为0马克。
- 初始化两个变量
-
动态规划更新:
- 对于每一天的汇率,计算并更新
a
和b
的值:a
更新为当前持有美元的价值和将马克兑换成美元后的价值的最大值。b
更新为当前持有马克的价值和将美元兑换成马克后的价值的最大值。
- 具体更新公式如下:
a = max(a, b / currency * 100)
b = max(b, a / 100 * currency)
- 这里
currency
是当天的汇率。
- 对于每一天的汇率,计算并更新
-
输出结果:
- 在最后一天结束时,戴维必须将所有马克换成美元,因此最终结果是
a
的值。 - 输出结果时保留两位小数。
- 在最后一天结束时,戴维必须将所有马克换成美元,因此最终结果是
详细步骤解释:
-
输入处理:
- 读取天数
N
。 - 读取每一天的汇率
A
。
- 读取天数
-
初始化变量:
a = 100.0
(初始持有100美元)。b = 0.0
(初始持有0马克)。
-
动态规划更新:
- 对于每一天的汇率
currency
:- 计算
temp = a
,保存当前美元的价值。 - 更新
a
:a = max(a, b / currency * 100)
,即比较保持美元不变和将马克换成美元后的价值,取最大值。 - 更新
b
:b = max(b, temp / 100 * currency)
,即比较保持马克不变和将美元换成马克后的价值,取最大值。
- 计算
- 对于每一天的汇率
-
输出结果:
- 最后一天结束时,输出
a
的值,保留两位小数。
- 最后一天结束时,输出
代码&解释:
c++代码:
方法一:STL(vector)
#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm> // for max function
using namespace std;
int main() {
int N;
cin >> N;
vector<int> rates(N);
for (int i = 0; i < N; ++i) {
cin >> rates[i];
}
double a = 100.0; // 初始持有100美元
double b = 0.0; // 初始持有0马克
double temp;
for (int i = 0; i < N; ++i) {
temp = a; // 保存当前美元的价值
a = max(a, b / rates[i] * 100); // 更新美元的最大价值
b = max(b, temp / 100 * rates[i]); // 更新马克的最大价值
}
// 输出最终的美元价值,保留两位小数
cout << fixed << setprecision(2) << a << endl;
return 0;
}
方法二:(动态归化)
#include<iostream>
using namespace std;
double a = 100.0,b,temp;
int n,currency;
int main(){
cin>>n;
for(int i = 1;i <= n;i++){
cin>>currency;
temp = a;
a = max(a,b / currency * 100);
b = max(b,temp / 100 * currency);
}
printf("%.2f",a);
return 0;
}
代码解释:
方法一:
-
输入处理:
- 使用
cin
读取天数N
。 - 使用
vector<int>
存储每一天的汇率。
- 使用
-
初始化变量:
a
初始化为100.0(表示初始持有100美元)。b
初始化为0.0(表示初始持有0马克)。
-
动态规划更新:
- 使用
for
循环遍历每一天的汇率。 - 在循环中,使用
temp
保存当前美元的价值。 - 使用
max
函数更新a
和b
的值:a = max(a, b / rates[i] * 100)
:比较保持美元不变和将马克换成美元后的价值,取最大值。b = max(b, temp / 100 * rates[i])
:比较保持马克不变和将美元换成马克后的价值,取最大值。
- 使用
-
输出结果:
- 使用
cout
输出最终的美元价值,保留两位小数。
- 使用
方法二:
-
定义变量:
double a = 100.0, b = 0.0, temp; int n, currency;
a
表示持有美元的最大价值,初始为100.0美元。b
表示持有马克的最大价值,初始为0.0马克。temp
用于临时保存当前美元的价值。n
表示天数。currency
表示当天的汇率。
-
输入处理:
cin >> n; // 读取天数n
- 从标准输入读取一个整数
n
,表示戴维学习汇率的天数。
- 从标准输入读取一个整数
-
动态规划更新:
for(int i = 1; i <= n; i++){ cin >> currency; // 读取当天的汇率 temp = a; // 保存当前美元的价值 a = max(a, b / currency * 100); // 更新美元的最大价值 b = max(b, temp / 100 * currency); // 更新马克的最大价值 }
- 使用
for
循环遍历每一天的汇率。 - 在循环中,首先读取当天的汇率
currency
。 - 使用
temp
保存当前美元的价值a
。 - 更新美元的最大价值
a
:a = max(a, b / currency * 100)
:比较保持美元不变和将马克换成美元后的价值,取最大值。
- 更新马克的最大价值
b
:b = max(b, temp / 100 * currency)
:比较保持马克不变和将美元换成马克后的价值,取最大值。
- 使用
-
输出结果:
printf("%.2f", a); // 输出最终的美元价值,保留两位小数
- 使用
printf
函数输出最终的美元价值,保留两位小数。
- 使用
Python代码:
def main():
n = int(input())
a = 100.0
b = 0.0
temp = 0.0
for _ in range(n):
currency = int(input())
temp = a
a = max(a, b / currency * 100)
b = max(b, temp / 100 * currency)
print(f"{a:.2f}")
if __name__ == "__main__":
main()
代码解释:
- 使用
input()
函数读取输入。 - 使用
max()
函数来比较并更新a
和b
的值。 - 使用格式化字符串
f"{a:.2f}"
来输出结果,保留两位小数。
Pascal代码:
program CurrencyExchange;
var
n, currency: integer;
a, b, temp: real;
i: integer;
begin
readln(n);
a := 100.0;
b := 0.0;
temp := 0.0;
for i := 1 to n do
begin
readln(currency);
temp := a;
if a < b / currency * 100 then
a := b / currency * 100
else
a := a;
if b < temp / 100 * currency then
b := temp / 100 * currency
else
b := b;
end;
writeln(a:0:2);
end.
代码解释:
- 使用
readln()
函数读取输入。 - 使用条件语句来比较并更新
a
和b
的值。 - 使用
writeln(a:0:2)
来输出结果,保留两位小数。