题意翻译:
如果一个序列是递增或递降的(相等也算增或降),则称它为有序的。给定一个序列,找出最短的非有序的子序列。子序列可以不连续。
解析:
情况 | 结果 | 原因 |
---|---|---|
\(N \le 2\) | 无解 | 元素只可能是单调的 |
在序列中有 \(a_x \le a_y\) 且 \(a_y \ge a_z\) 或 \(a_x \ge a_y\) 且 \(a_y \le a_z\) 的情况 | 一定有解 | 这些元素形成无序的情况 |
我们明显要着重分析 \(N \ge 3\) 情况:
我们首先需要的是分析是否存在 \(a_1 \le a_i\) 且 \(a_i \ge a_j\) 或 \(a_1 \ge a_i\) 且 \(a_i \le a_j\) 的情况。
Q:为啥是这样?
如果有解,第一个是 \(a_1\)。
再简化:是否存在 \(a_1 \le a_i\) 且 \(a_i \ge a_{i+1}\) 或 \(a_1 \ge a_i\) 且 \(a_i \le a_{i+1}\) 的情况。
Q:为啥是这样?
因为:
-
如果 $a[i]>a[i+1]$: 如果 $a[1]$ 是三者最大,呈降序,不符合条件,舍去。 如果 $a[1]$ 居中,满足“小大小”无序。 如果 $a[1]$ 是三者最小,同上。
--by ahawzlc
所以仅需枚举 \(1\) 至 \(N\) 即可。
CODE:
#include <iostream>
using namespace std;
int a[100001];
int main(){
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>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])){
cout<<3<<endl<<1<<' '<<i<<' '<<i+1;
return 0;
}
}
cout<<"0\n";
return 0;
}