正题
题目大意
0 ∼ n 0\sim n 0∼n的点,从 i i i移动到 j j j获得 a j ∗ ( j − i ) a_j*(j-i) aj∗(j−i)的价值。求最大价值。
解题思路
考虑贪心,每次移动到往后 a i a_i ai最大的点。
证明:
反证明:我们假设有一种情况 i < j i<j i<j且 a j < a i a_j<a_i aj<ai但是之间移动到 j j j比先移动到 i i i更优。
但是若我们先移动到 i i i之后在移动 j j j权值为 i ∗ a i + ( j − i ) ∗ a j i*a_i+(j-i)*a_j i∗ai+(j−i)∗aj而之间移动到 j j j权值为 j ∗ a j j*a_j j∗aj。两个抵消掉 ( j − i ) ∗ a j (j-i)*a_j (j−i)∗aj的部分就是 i ∗ a i i*a_i i∗ai和 i ∗ a j i*a_j i∗aj。因为 a i > a j a_i>a_j ai>aj所以先移动到 i i i更优。
此情况不存在
证毕
所以我们预处理后缀
m
a
x
max
max就好了
c o d e code code
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int n,a[N],maxs[N],ans,last;
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=n;i>=0;i--)
maxs[i]=max(maxs[i+1],a[i]);
last=0;
for(int i=1;i<=n;i++){
if(a[i]==maxs[last+1]){
ans+=(i-last)*a[i];
last=i;
}
}
printf("%d",ans);
}