求助!5wa

P1968 美元汇率

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


|