CF1364B

题目简化和分析:

这题没啥好说的,找其绝对值最大,也就是找到每一个山峰山谷。

这样不仅满足选择的个数最少,并且值最大。

正确性证明:

  • \(a\le b\le c\)
  • \(|a-b|+|b-c|=(b-a)+(c-b)=b-a+c-b=c-a=|a-c|\)
  • \(a\ge b\ge c\)
  • \(|a-b|+|b-c|=(a-b)+(b-c)=a-b+b-c=a-c=|a-c|\)

注意:最后一个特判一下。

Solution:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N=1e5+50;
const int M=1e5+50;
const int Mod=1e9+7;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int t,n;
int a[N];

int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;++i){
			scanf("%d",&a[i]);	
		}
		queue<int>q;
		int f=-1,ans=0;
		for(int i=1;i<n;++i){
			int k=(a[i]>a[i+1]);
			if(k!=f){
				q.push(a[i]);
				++ans;
				f=k;
			}
		}
		q.push(a[n]);
		++ans;
		printf("%d\n",ans);
		while(!q.empty()){
			printf("%d ",q.front());
			q.pop();
		}
		printf("\n");
	}
	return 0;
}
posted @ 2022-08-10 21:39  RVG  阅读(24)  评论(0)    收藏  举报