zoukankan      html  css  js  c++  java
  • 排序子序列--全国模拟(三)

    牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为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)本题依次比较整个数组
    2)a[i+1]>a[i] ,则进入大于操作,直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断
    3)a[i+1]<a[i],则进入小于操作,直到遍历到下一个值不小于等于为止count++,然后进行下一位置的判断
    4)a[i+1] == a[i]不进行操作,进行下一位置遍历
     
    本题注意点:
    1)本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;
    分为三种情况,若到a[n-1] 的最后一组是非递减序列,a[n]=0  在增遍历中执行完i=n-1 for循环使得i=n,不执行for循环结束,因此不影响
    第二种情况  若到a[n-1] 的最后一组是非递增序列,a[n]=0  在减遍历中执行完i=n-1 for循环使得i=n,不执行for循环结束,因此不影响
    第三种情况  1 2 1 2 1最后一个数是单独的情况,执行完最后一组1 2 i=3 ,for循环i++,此时i=4, <=4 继续执行,此时a[5]为0,a[4]<a[5]进入降处理,count++;i超出范围退出循环。
    所以a[n]为0保证了结果的正确性。因此成立
     
    2)本题中全部相等情况,只执行了i++,未对count进行其他相应处理,所以全部相等情况应进行特殊处理。首先定义equal,每次相等equal++,n个数,共有n-1组相等,因此当equal==n-1表示全部相等的情况,此时应输出1
     
     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4  
     5 int main()
     6 {
     7     int n;
     8     while(cin>>n)
     9     {
    10         int a[n];
    11         int equal = 0;//定义相等的数目,防止数组中所有元素全相等情况
    12         int count = 0;
    13         for(int i=0;i<n;i++)
    14         {
    15             cin>>a[i];
    16         }
    17         a[n] = 0;
    18         if(n==1)
    19         {
    20             count=1;
    21         }
    22         for(int i=0;i<=n;i++)
    23         {
    24             cout<<a[i]<<endl;
    25         }
    26         for(int i=0;i<=n-1;i++)
    27         {
    28             int result = a[i];
    29             if(a[i+1] > result)
    30             {
    31                 while(a[i+1] >= result)
    32                 {
    33                     i++;
    34                     result = a[i];
    35                 }
    36                
    37                 count++;
    38  
    39             }
    40             else if(a[i+1] < result)
    41             {
    42                 while(a[i+1] <= result)
    43                 {
    44                     i++;
    45                     result = a[i];
    46                 }
    47                
    48                 count++;
    49  
    50             }
    51             else
    52             {
    53                 equal++;
    54                 continue;
    55             }
    56         }
    57         if(equal == n-1)
    58             cout<<1<<endl;
    59         else
    60             cout<<count<<endl;
    61  
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)
    有空必看
    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换
    FusionCharts JavaScript API Column 3D Chart
    FusionCharts JavaScript API
    FusionCharts JavaScript API
    Extjs 继承Ext.Component自定义组件
    eclipse 彻底修改复制后的项目名称
    spring 转换器和格式化
    Eclipse快速生成一个JavaBean类的方法
  • 原文地址:https://www.cnblogs.com/qqky/p/6884042.html
Copyright © 2011-2022 走看看