Northmi @ 2023-09-24 00:49:03
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int day;
int flg_to_money = 0; // 找到最小值
int flg_to_future = 0; // 找到最大值
int min_targ_day = 0;
int max_targ_day = 0;
int flg_start = 0;
int a[100];
float money = 100.0;
cin >> day;
for (int i = 0; i < day; i++)
{
cin >> a[i];
}
for (int i = 1; i < day; i++)
{
/* 找出最高点 大于最大值 */
if (a[i] > a[i - 1] && a[i + 1] < a[i] )
{
max_targ_day = i;
flg_to_future = 1;
flg_start = 1;
}
// 初始为下降
if (a[i] < a[i - 1] && flg_start == 0)
{
flg_start = 1;
max_targ_day = 0;
flg_to_future = 1;
}
// 找最小点
if ((a[i] < a[i - 1] && a[i] < a[i + 1] && flg_to_future == 1))
{
min_targ_day = i;
flg_to_money = 1;
}
// 最后一点的特殊处理
if ((i == day - 1) && (a[i] < a[i - 1]))
{
min_targ_day = i;
flg_to_money = 1;
}
// 最大值最小值均找到,且到了下一个下降点
if (a[i] < a[i - 1] && flg_to_future == 1 && flg_to_money == 1)
{
money = money * a[max_targ_day] / 100;
money = money / a[min_targ_day] * 100;
flg_to_future = 0;
flg_to_money = 0;
max_targ_day = i - 1;
min_targ_day = i;
}
}
cout << money << endl;
return 0;
}
思路为寻找汇率的拐点,进行成对的交易,其中分别对起始和结尾做了特殊处理,但是测试用例的第四个和后面四个错了,求大佬帮助
by HuangChusenX @ 2024-05-03 14:01:18
重点不是找最大值,而是找出所有尽量长的不上升子序列 例如:400 300 500 300 250,可以拆分为“400 300”和“500 300 250”两个不上升子序列,在子序列中汇率最高的那一天买马克,最低的一天买美元。例如“500 300 250”,在汇率为500的时候买马克,汇率为250的时候买美元。 特判:存在长度只有1的序列,直接continue