1 条题解

  • 0
    @ 2024-10-13 22:17:10

    Self-deception

    题解

    因为Monster是懒狗,所以题解也很水。

    首先第一反应肯定是直接暴力,双重循环,能过60,但是想要全过的话,数据范围显然不允许这种事的发生。

    观察公式。

    FinalValue=max(value[i]+value[j]+ij)FinalValue = max(value[i] + value[j] + i - j)

    我们将要求的FinalValueFinalValue分成两个部分,分别是value[i]+ivalue[i] + ivalue[j]jvalue[j]-j,也就是说,我们只需要分别求出对应的这两个部分的最大值,并且保证0i<j<n0\le i < j < n,就可以得到最终的最大值。

    题目中说了,所有valuevalue都会给出。也就是说,对于已经给定的数组,对于特定的iijj而言,value[i]+ivalue[i] + ivalue[j]jvalue[j]-j值都是确定的。同时注意到i<ji < j,所以我们通过一遍遍历,就可以在逐步更新value[j]jvalue[j]-j的情况下,求出FinalValueFinalValue的最大值。

    哦对,注意valuevalue的范围,不开long longlong\ long见祖宗,养成观察数据范围的好习惯。

    详见代码。

    代码

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    int main()
    {
        int n;
        ll FinalValue = 0;
        cin >> n;
        vector<ll> values(n);
        for (int i = 0; i < n; i++)
            cin >> values[i];
        ll temp = values[0] + 0;
        // 一遍遍历整个数组
        for (int j = 1; j < n; j++)
        {
            // 更新FianlValue = max(temp + value[j] - j);
            if (FinalValue < temp + values[j] - j)
                FinalValue = temp + values[j] - j;
            // 更新value[i] + i的最大值
            if (temp < values[j] + j)
                temp = values[j] + j;
        }
        cout << FinalValue << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    204
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    117
    已通过
    21
    上传者