排序子序列

来源:互联网 发布:beyonce running 知乎 编辑:程序博客网 时间:2024/06/05 20:26

Question

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

Algorithm

一开始还自作聪明的用上升下降沿来做,但是这种方法很有问题,比如1212121这种情况,就是大大的bug。其实就直接求对递增,递减的情况计数就行。最后注意,最后一个数的情况。

Code

#include<iostream>#include<vector>using namespace std;int main(){    int n;    while(cin>>n){        vector<int> v(n);        for(int i=0;i<n;i++){            cin>>v[i];        }        int i=0;        int res=0;        while(i<n-1){            while(i<n-1 && v[i]==v[i+1])                i++;            if(i<n-1 && v[i]>v[i+1]){                res++;                while(i<n-1 && v[i]>=v[i+1])                    i++;                i++;            }            else if(i<n-1 && v[i]<v[i+1]){                res++;                while(i<n-1 && v[i]<=v[i+1])                    i++;                i++;            }        }        if(i==n-1)            cout<<res+1<<endl;        else            cout<<res<<endl;    }    return 0;}
原创粉丝点击