排序子序列--全国模拟

Posted qqky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序子序列--全国模拟相关的知识,希望对你有一定的参考价值。

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

 

以上是关于排序子序列--全国模拟的主要内容,如果未能解决你的问题,请参考以下文章

最长公共连续子串--全国模拟

归并排序(Merge Sort)思想,代码实现

排序算法归并排序

序列「CSP-S全国排位赛第一场」

笔试强训之每日一题

归并排序(Merge Sort)