极其坑爹的一道题目啊。。
一开始拿那什么判断下降子序列在那捣腾,心里想B组题目怎么这么难。。
后来仔细一想,对于第i-1,i 和 i+1三个数,ans+=max(0,(a[i]-a[i-1]))+max(0,(a[i+1]-a[i]));
为什么呢,因为如果后面的数比a[i-1]要小,那么在第一次a[i]升级为与a[i-1]相等的时候,顺便把他带上就行了,而且a[i+1]与[i]之间的差值并不会变。
重点是不论怎么搞,相邻两个数(除了正在发生断裂的a[i-1]与a[i]以外),其他的相对差值都不会变。
于是只要计算相邻两两差值就哈勒。。。
晚上写题目脑子不太好使。
#include<iostream>
using namespace std;
const int maxn=100000;
long long int n,a[maxn+1],ans;
void read()
{
int i;
std::ios::sync_with_stdio(false);
cin>>n;
for(i=1; i<=n; i++)
cin>>a[i];
for(i=2; i<=n; i++)
if(a[i]<a[i-1])
ans+=a[i-1]-a[i];
cout<<ans;
return;
}
int main()
{
read();
return 0;
}
AC代码。