图片说明
题意:让你从序列中找出某些元素,让其|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;
}