788A

来源:互联网 发布:网络电玩游戏博客 编辑:程序博客网 时间:2024/06/08 05:14

题意:给一个公式,1 ≤ l < r ≤ n),(1=<I<=n),和a数组,求f(l,r)的最大值

思路:令b[I] = | a[I]-a[I+1]  | ,可以发现f(l,r)的最大值要么在 {b1,-b2,+b3,... ,(+ or -) bn-1},要么在{-b1,b2,-b3,b4,...,(- or +) bn-1 }中,两个序列中最大连续子序列和较大者为答案

#include<cstdio>#include<cstring>#include<cmath>#define ll long longusing namespace std;const int maxn = 1e5+10;int b[maxn],c[maxn];int main(){int n;while(scanf("%d",&n)!=EOF){int a,a1;scanf("%d",&a1);for(int i=1;i<n;i++){scanf("%d",&a);if(i%2==0){b[i]=abs(a-a1);c[i]=-b[i];}else{b[i]=-abs(a-a1);c[i]=-b[i];}a1=a;}ll Max1,Max2,sum1=0,sum2=0;Max1=Max2=-(1<<30);for(int i=1;i<n;i++){if(sum1<=0)sum1=b[i];elsesum1+=b[i];if(sum1>Max1)Max1=sum1;if(sum2<=0)sum2=c[i];elsesum2+=c[i];if(sum2>Max2)Max2=sum2;}ll ans=Max1>Max2?Max1:Max2;printf("%I64d\n",ans);}}

原创粉丝点击