CF27C

题意为找出最短的无序子序列。这题看到 \(k\) 的取值有多种可能,我们不妨对其取值作分类讨论。

  • \(k=1\)\(k=2\)

很显然,当 \(k=1\) 时,只有一个数,不满足题意;当 \(k=2\) 时,两个数之间一定是递增或递降的,也不符合要求。

  • \(k=3\)

\(k=3\) 时,存在两种可能的情况是有解的。设三个数从前至后依次为 \(a,b\)\(c\)

  1. \(a < b\) 并且 \(c<b\)

这种情况即是出现了一个“山峰”,左右的数都比中间小,不是有序的子序列。

  1. \(a>b\) 并且 \(c>b\)

这种情况即是出现了一个“低谷”,左右的数都比中间大,也不是有序的子序列。

  • \(k>3\)

很容易得知,既然存在 \(k>3\) 的非有序子序列,它肯定是由比它短的子序列构成的。因此若存在 \(k>3\) 的非有序子序列,则一定也存在 \(k=3\) 的子序列。

分析完毕之后,实现思路就很简单了:在整个序列中判断是否存在长度为 \(3\) 的非有序子序列,若有则输出方案,否则无解。

代码见下:

#include <iostream>
#include <cstdio>
using namespace std;
int n,a[1000001];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	if(n==1||n==2)	
	{
		cout<<0;
		return 0;
	}
	for(int i=2;i<n;i++)
		if(a[i]<a[1]&&a[i]<a[i+1]||a[i]>a[1]&&a[i]>a[i+1])	
		{
			cout<<3<<endl;
			cout<<1<<' '<<i<<' '<<i+1;
			return 0;
		}
	cout<<0;
	return 0;
}
posted @ 2024-01-20 17:43  liyilang2021  阅读(3)  评论(0编辑  收藏  举报