題目鏈接
題意:
現在給你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;
}