傳智杯 程序員節發橙子 思維

題目鏈接

題意:

現在給你n個數, 它們排成一個序列。現在要求分數高的同學獲得的積分要比他相鄰的同學獲得的積分多,如果相鄰兩個同學獲得的積分一樣多,那麼他們獲得積分相同。問如何分配才能使所用積分最少。

思路:

我們初始化所有人的積分爲1, 按照題意來,如果發現他前邊的同學比他分數低,那麼他的積分就比他前面的同學多1,相同就等於他前面的同學。
這是正序,然後再倒序來一次。
如果發現他後邊的同學分數比他低,他的分數就比他後面的同學多1.注意,倒序時,一定要取最大值。這個多測樣例就能發現。

#include<bits/stdc++.h>
using namespace std;
long long a[1000005], v[1000005];
int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++)
    {
        cin >> a[i];
        v[i] = 1;
    }
    for(int i = 1;i <= n;i++)
    {
        if(a[i] > a[i - 1] && i != 1)
        {
            v[i] = v[i - 1] + 1;
        }
        else if(a[i] == a[i - 1])
        {
            v[i] = v[i - 1];
        }
    }
    for(int i = n;i >= 1;i--)
    {
        if(a[i] > a[i + 1] && i != n)
        {
            v[i] = max(v[i + 1] + 1, v[i]);
        }
        else if(a[i] == a[i + 1])
        {
            v[i] = v[i + 1];
        }
    }
    long long ans = 0;
    for(int i = 1;i <= n;i++)
    {
      // cout << v[i] << " ";
        ans += v[i];
    }
    //cout << endl;
    cout << ans << endl;

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章