历届试题 连号区间数
2015-04-04 17:14
190 查看
题目
问题描述
小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:
如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
输入格式
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。
输出格式
输出一个整数,表示不同连号区间的数目。样例输入1
43 2 4 1
样例输出1
7样例输入2
53 4 2 5 1
样例输出2
9思路:
直接暴力判断,60分改进一下,既然给的是全排列,两两不相同,只要区间内的 最大数 - 最小数 = 区间长度 即可。
代码
import java.util.*; import java.math.*; import java.util.regex.*; public class Main { final static int INF = 0x3f3f3f3f; final static int NUM = 100; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n; while (sc.hasNext()) { n=sc.nextInt(); int[] a=new int ; for(int i=0;i<n;i++)a[i]=sc.nextInt(); int ans=0; for(int i=0;i<n;i++) { int maxn=-INF,minn=INF; for(int j=i;j<n;j++) { maxn=maxn>a[j]?maxn:a[j]; minn=minn<a[j]?minn:a[j]; if(maxn-minn==j-i)ans++; // int[] b=new int[j-i+1]; // for(int k=i,l=0;k<=j;k++,l++) // b[l]=a[k]; // Arrays.sort(b); // if(b.length==1)ans++; // else { // boolean bl=true; // for(int x=1;x<b.length;x++) // if(b[x]!=b[-1]+1)bl=false; // if(bl)ans++; // } } } System.out.println(ans); } } }
相关文章推荐
- 历届试题 连号区间数
- 历届试题 连号区间数【java】
- 1600:历届试题 连号区间数
- 蓝桥杯, 历届试题 连号区间数 (暴力)
- 蓝桥杯历届试题——连号区间数
- 蓝桥杯 历届试题 连号区间数
- 历届试题 连号区间数
- 历届试题 连号区间数
- 历届试题 连号区间数
- 历届试题 连号区间数
- 历届试题 PREV-7 连号区间数
- 蓝桥杯--历届试题 连号区间数
- 历届试题 连号区间数
- 历届试题 连号区间数 (蓝桥杯)
- 蓝桥- 历届试题 2013-10-19 连号区间数 贪心
- 历届试题 连号区间数
- 蓝桥杯 历届试题 7.连号区间数
- 蓝桥杯 历届试题 连号区间数
- 【蓝桥杯】历届试题 连号区间数(运行超时)
- 蓝桥杯 历届试题 连号区间数