历届试题 连号区间数
Posted 最美遇见你
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了历届试题 连号区间数相关的知识,希望对你有一定的参考价值。
LOCAL
Time Limit: 1
Memory Limit: 128
Accepted/Submissions: 119 / 187
Description
小明这些天一直在思考这样一个奇怪而有趣的问题:
在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:
如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:
如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
Input
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。
第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。
Output
输出一个整数,表示不同连号区间的数目。
Sample Input
样例输入1 4 3 2 4 1 样例输入2 5 3 4 2 5 1
Sample Output
样例输出1 7 样例输出2 9
Source
蓝桥杯
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn = 5001; int a[maxn]; int main(void) { int n,cnt=0; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { int minn=a[i],maxn=a[i]; for(int j=i;j<n;j++) { if(a[j]<minn) minn=a[j]; if(a[j]>maxn) maxn=a[j]; if(maxn-minn+1==j-i+1) cnt++; } } printf("%d",cnt); return 0; }
纠结:这样的破程序竟然能够AC,这是让人感到难过。
以上是关于历届试题 连号区间数的主要内容,如果未能解决你的问题,请参考以下文章