1、排序子序列 牛牛定义排序子序列为一个数组中一段连续的子序列, 并且这段子序列是非递增或者非递减排序的。 牛牛有一 个长度为n的整数数组A, 他现在有一个任务是把数组A分为若干段排序子序列, 牛牛想知道他最少可以把这个数 组分为几段排序子序列.如样例所示, 牛牛可以把数组A划分为[1, 2, 3]和[2, 2, 1]两个排序子序列, 至少需要划分为2个排序子序列
2、输入描述: 输入的第一行为一个正整数n(1 ≤ n ≤ 10 ^ 5) 第二行包括n个整数A_i(1 ≤ A_i ≤ 10 ^ 9), 表示数组A的每个数字。3、输出描述: 输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
4、示例: 输入 6 1 2 3 2 2 1 --> 1 1 2 2 2 3 输出 2 ------牛客网
分析题目:
题目的要求是按照输入顺序将整个数据分为一片片不连续增长(减少)的段,至少可以分多少段(题目一定要理解清楚,第一次看题我是真的不知道在干啥):递减就是a[i]>a[i+1],非递减就是a[i]<=a[i+1],递增就是a[i]<a[i+1],非递增就是a[i]>=a[i+1]。 这句话很重要,出题的作者可能想让大家这样想,(但是,非递减不就包括了递增吗,比如1 2 3 ,这不矛盾吗,小声哔哔,但题还是要做的。)
解决方案:
1.输入数据总长度和各个值
2.分为三种途径:
2.1. a[i+1]>a[i] ,则进入非递增序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位 置的判断
2.2. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位 置的判断
2.3. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减 序列。
3.输出count即可。
虽然提交成功了,但是感觉好像哪里不对(上面矛盾的那里),也许我理解错了,哪位大佬有有更清晰的做法和思路(或者解释一下我上述的矛盾),欢迎探讨。
#include<iostream>
#include<vector>
using namespace std;
int NUINIU_sort()
{
int i = 0;
int count = 0;
int n;
vector<int> vres;
cin >> n;
vres.resize(n+1);
for (int i = 0; i < n; i++)
{
cin >>vres[i] ;
}
while (i < n)
{
if (vres[i] < vres[i + 1])
{
while (i < n && vres[i] < vres[i + 1])
{
i++;
}
i++;
count++;
}
else if(i < n && vres[i] == vres[i + 1])
{
i++;
}
else if (vres[i] > vres[i + 1])
{
while (i < n && vres[i] > vres[i + 1])
{
i++;
}
i++;
count++;
}
}
return count;
}
int main()
{
cout << NUINIU_sort() << endl;
system("pause");
return 0;
}