标签:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5805
题意:删除数列中一个数,找出相邻之差绝对值最大,求依次删除最大值的和
解法:删除边缘位置的数字需要注意 它们的差就是 a[i-1]-a[i-2] ,a[i+2]-a[i+1],a[i-1]-a[i+1]的绝对值,当然,把最大的加起来就行
#include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream> #include<set> #include<queue> #include<map> #include<vector> #include<algorithm> #include<limits.h> #define inf 0x3fffffff #define INF 0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define ULL unsigned long long using namespace std; long long n,m; long long a[100005]; long long q,p; long long b[100005],e[100005],c[100005]; long long sum=0; int t; long long MAXN1,MAXN2; int main() { scanf("%d",&t); while(t--) { sum=0; memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); memset(e,0,sizeof(e)); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } MAXN1=0; MAXN2=0; for(int i=3; i<=n; i++) { MAXN1=max(MAXN1,abs(a[i-2]-a[i-1])); c[i]=MAXN1; } for(int i=n-2; i>=1; i--) { MAXN2=max(MAXN2,abs(a[i+2]-a[i+1])); b[i]=MAXN2; } for(int i=2; i<=n-1; i++) { e[i]=abs(a[i-1]-a[i+1]); } for(int i=2; i<=n-1; i++) { sum+=max(e[i],max(c[i],b[i])); } sum+=(b[1]+c[n]); printf("%lld\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yinghualuowu/p/5745029.html