P1968 美元汇率

题目传送门

思路:

  1. 输入处理

    • 首先读取一个整数 N,表示戴维学习汇率的天数。
    • 然后读取 N 个整数,每个整数表示每一天的汇率 A,即100美元可以兑换的马克数。
  2. 初始化变量

    • 初始化两个变量 a 和 b,分别表示持有美元和马克的最大价值。初始时,a 为100美元,b 为0马克。
  3. 动态规划更新

    • 对于每一天的汇率,计算并更新 a 和 b 的值:
      • a 更新为当前持有美元的价值和将马克兑换成美元后的价值的最大值。
      • b 更新为当前持有马克的价值和将美元兑换成马克后的价值的最大值。
    • 具体更新公式如下:
      • a = max(a, b / currency * 100)
      • b = max(b, a / 100 * currency)
    • 这里 currency 是当天的汇率。
  4. 输出结果

    • 在最后一天结束时,戴维必须将所有马克换成美元,因此最终结果是 a 的值。
    • 输出结果时保留两位小数。

详细步骤解释:

  1. 输入处理

    • 读取天数 N
    • 读取每一天的汇率 A
  2. 初始化变量

    • a = 100.0(初始持有100美元)。
    • b = 0.0(初始持有0马克)。
  3. 动态规划更新

    • 对于每一天的汇率 currency
      • 计算 temp = a,保存当前美元的价值。
      • 更新 aa = max(a, b / currency * 100),即比较保持美元不变和将马克换成美元后的价值,取最大值。
      • 更新 bb = max(b, temp / 100 * currency),即比较保持马克不变和将美元换成马克后的价值,取最大值。
  4. 输出结果

    • 最后一天结束时,输出 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;
}
 

代码解释:

方法一:
  1. 输入处理

    • 使用cin读取天数N
    • 使用vector<int>存储每一天的汇率。
  2. 初始化变量

    • a初始化为100.0(表示初始持有100美元)。
    • b初始化为0.0(表示初始持有0马克)。
  3. 动态规划更新

    • 使用for循环遍历每一天的汇率。
    • 在循环中,使用temp保存当前美元的价值。
    • 使用max函数更新ab的值:
      • a = max(a, b / rates[i] * 100):比较保持美元不变和将马克换成美元后的价值,取最大值。
      • b = max(b, temp / 100 * rates[i]):比较保持马克不变和将美元换成马克后的价值,取最大值。
  4. 输出结果

    • 使用cout输出最终的美元价值,保留两位小数。
方法二:
  1. 定义变量

    double a = 100.0, b = 0.0, temp;
    int n, currency;
    
    • a 表示持有美元的最大价值,初始为100.0美元。
    • b 表示持有马克的最大价值,初始为0.0马克。
    • temp 用于临时保存当前美元的价值。
    • n 表示天数。
    • currency 表示当天的汇率。
  2. 输入处理

    cin >> n; // 读取天数n
    
    • 从标准输入读取一个整数 n,表示戴维学习汇率的天数。
  3. 动态规划更新

    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):比较保持马克不变和将美元换成马克后的价值,取最大值。
  4. 输出结果

    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) 来输出结果,保留两位小数。

希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻题解,神犇勿喷,点个赞再走吧!QAQ
  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值