题解 CF27C 【Unordered Subsequence】

思路:推理


首先我们知道,如果一个数列长度 \(len\le 2\),那么这个数列肯定不是无序的,证明显然。

题目中要求求最短的序列,那么只要题目有解,我们肯定能找到一个 \(len=3\) 的无序序列。

对于这个题,有一种简便方法,就是只枚举 i ,如果这个序列是有解的,那么肯定能找到 \(a[1],a[i],a[i+1]\) 是无序的情况。

证明一下:

  1. 如果\(a[i]>a[i+1]\)
    1. 如果\(a[1]\)是三者最大,呈降序,不符合条件,舍去。
    2. 如果\(a[1]\)居中,满足“小大小”无序。
    3. 如果\(a[1]\)是三者最小,同上。
  2. 如果\(a[i]<a[i+1]\)
    1. 如果\(a[1]\)是三者最大,满足“大小大”无序。
    2. 如果\(a[1]\)居中,同上。
    3. 如果\(a[1]\)是三者最小,呈升序,不符合条件,舍去。

除了这些情况的,一定无解。

代码奉上:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int a[N],n;
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=2;i<n;i++) {//注意越界问题
		if((a[i+1]>a[i]&&a[i]<a[1])||(a[i+1]<a[i]&&a[i]>a[1])) {
			printf("3\n1 %d %d\n",i,i+1);
			return 0;//找到答案直接输出结束。
		}
	}
	printf("0\n");//非要无解我莫得办法
	return 0;
}
posted @ 2020-08-03 21:02  ahawzlc  阅读(102)  评论(0编辑  收藏  举报