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


    牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为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的每个数字。



    输出描述:
    输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
    输入例子:
    6
    1 2 3 2 2 1
    输出例子:
    2

    思路:理解题目的子序列:即单调不具有极值

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #define n 10000
     4 
     5 int N;
     6 int A[n],res=0;
     7 
     8 int up(int i)//非递减
     9 {
    10     while((i!=N-1)&&A[i]<=A[i+1])
    11         ++i;
    12     return i;
    13 }
    14 
    15 int down(int i) //非递增
    16 {
    17     while((i!=N-1)&&A[i]>=A[i+1])
    18         ++i;
    19     return i;
    20 }
    21 int main()
    22 {
    23     scanf("%d",&N);
    24     for(int i=0;i<N;++i)
    25         scanf("%d",&A[i]);
    26     for(int i=0;i!=N;)
    27     {
    28         while(A[i]==A[i+1]) //相等就跳过
    29             ++i;
    30         if(A[i]<A[i+1])
    31             {i=up(i)+1;
    32             ++res;}
    33         else
    34             {i=down(i)+1;
    35             ++res;}
    36         printf("i:%d res:%d
    ",i,res);//此题不需要这行 
    37     }
    38     printf("%d",res);
    39 }

  • 相关阅读:
    /etc/init.d/functions: No such file or directory报错问题
    在Linux上安装Python3.7.1
    python 使用openpyxl实现读写xlsx文件
    Git 撤销本地修改
    element的el-table表格自定义表头,slot="header"内,数据不更新的问题
    记录下本地修改文件名称大小写问题线上说找不到文件
    解决国内访问github慢的问题笔记
    vue项目中使用echarts实现疫情地图
    uni-app项目搭建
    uniapp引入uni-ui组件报错TypeError: this.getOptions is not a function
  • 原文地址:https://www.cnblogs.com/olivegyr/p/6984515.html
Copyright © 2020-2023  润新知