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

京公网安备 11010502036488号