ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

历届试题 连号区间数

2019-03-01 11:43:22  阅读:251  来源: 互联网

标签:50000 试题 int memset 样例 区间 历届 array


问题描述

小明这些天一直在思考这样一个奇怪而有趣的问题:

在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:

如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。

当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。

输入格式

第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。

第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。

输出格式

输出一个整数,表示不同连号区间的数目。

样例输入1 4
3 2 4 1
样例输出1 7 样例输入2 5
3 4 2 5 1
样例输出2 9  版本一:时间复杂度为o(n^3),部分测试用例超时
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 int array[50000];
 5 int array1[50000];
 6 int Test(int m,int array[])
 7 {
 8     int flag=1;
 9     sort(array,array+m);
10     for(int i=0;i<m-1;i++)
11     {
12            if(array[i]+1!=array[i+1])
13            {
14                flag=0;
15                break;
16            }
17     }
18     return flag;
19 }
20 int main()
21 {
22     int n;
23     cin >> n;
24     memset(array,0,sizeof(array));
25     memset(array1,0,sizeof(array1));
26     for(int i=0;i<n;i++){
27           cin >> array[i];
28     }
29     int sum=n;
30     int  step=1;
31     while(true){
32         step++;
33         for(int i=0;i<n-step+1;i++)
34         {
35             for(int j=0;j<step;j++){
36                 array1[j]=array[i+j];
37             }
38             int aq=Test(step,array1);
39             if(aq==1) sum++;
40         }
41         if(step==n) break;
42     }
43     cout << sum << endl;
44     return 0;
45 }

版本2 核心思路同版本一,时间复杂度为o(n^2),ac

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int array[50000];
 4 int main()
 5 {
 6     int n;
 7     int sum=0;
 8     cin >> n;
 9     memset(array,0,sizeof(array));
10     for(int i=0;i<n;i++){
11           cin >> array[i];
12     }
13     int L;
14     int R;
15     for(int i=0;i<n;i++)
16     {
17         L=array[i];
18         R=array[i];
19         for(int j=i+1;j<n;j++)
20         {
21             if(array[j]>R) R=array[j];
22             if(array[j]<L) L=array[j];
23             if(R-L==j-i) sum++;
24         }
25     }
26     cout << sum+n << endl;
27     return 0;
28 }

 

标签:50000,试题,int,memset,样例,区间,历届,array
来源: https://www.cnblogs.com/henuliulei/p/10455400.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有