zoukankan      html  css  js  c++  java
  • 试题 历届试题 连号区间数(规律)

    问题描述

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

    在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
    思路
    样例1的区间分别是
    [3,3],[3,2],[3,2,4],[3,2,4,1],[2,2],[4,4],[1,1];
    由于是全排列,所以找所有的区间数我们不需要去分别模拟排序。
    记录区间的最大值和最小值,区间最大值与最小值的差如果等于结束位置-初始位置,证明为连号区间。
    从左到右,依次遍历一遍。
    #include<bits/stdc++.h>
    using namespace std;
    int minn,maxx;
    int a[50005];
    int main(){
        int n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<n;i++){
            minn=a[i];
            maxx=a[i];
            for(int j=i;j<n;j++){
                if(a[j]<minn)minn=a[j];
                if(a[j]>maxx)maxx=a[j];
                if(j-i==maxx-minn)sum++;
            }
        }
        cout<<sum<<endl;
        return 0;
    }

     

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/mohari/p/13426745.html
Copyright © 2011-2022 走看看