题意:让你从序列中找出某些元素,让其|a1-a2|+|a2-a3|+|a3-a4|+…+|an-1-an|的值最大化,输出你找出对的这些元素(元素相对位置不可以变化)。
题解:我们我们可以把这个序列中的所有元素抽象成一个函数图像,那么我们找出这个(函数)上的所有极值点即可,必定极大值和极小值是交替的。我们让他们彼此相减即可。
/*Keep on going Never give up*/ #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> const int maxn = 1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int mod = 100000000; using namespace std; int a[maxn]; int rem[maxn]; int main() { int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n;i++) scanf("%d",&a[i]); int cnt=1; rem[0]=a[0]; for(int i=1;i<n-1;i++){ if(a[i]>a[i-1]&&a[i]>a[i+1]) rem[cnt++]=a[i]; else if(a[i]<a[i-1]&&a[i]<a[i+1]) rem[cnt++]=a[i]; } if(rem[cnt-1]!=a[n-1]) rem[cnt++]=a[n-1]; int ans=0; //for(int i=0;i<cnt-1;i++) ans+=abs(rem[i]-rem[i+1]); printf("%d\n",cnt); for(int i=0;i<cnt;i++){ printf("%d ",rem[i]); } printf("\n"); } return 0; }