CF27C
题意为找出最短的无序子序列。这题看到 \(k\) 的取值有多种可能,我们不妨对其取值作分类讨论。
- \(k=1\) 或 \(k=2\)
很显然,当 \(k=1\) 时,只有一个数,不满足题意;当 \(k=2\) 时,两个数之间一定是递增或递降的,也不符合要求。
- \(k=3\)
当 \(k=3\) 时,存在两种可能的情况是有解的。设三个数从前至后依次为 \(a,b\) 和 \(c\)。
- \(a < b\) 并且 \(c<b\)
这种情况即是出现了一个“山峰”,左右的数都比中间小,不是有序的子序列。
- \(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;
}
还是菜。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】