zoukankan      html  css  js  c++  java
  • 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 }

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/olivegyr/p/6984515.html
Copyright © 2011-2022 走看看