zoukankan      html  css  js  c++  java
  • 蓝桥杯之 连号区间数(巧妙遍历)

    Description

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

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

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

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

    Input

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

    第二行是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

    蓝桥杯
     
     
    分析:
    两种方法,一种是直接暴力,对每种可能都sort一下,看看是否符合要求,但是这种方法会超时。。。
    第二种方法可以叫做巧妙的遍历
     
    对每种可能,找到最大值和最小值,如果最大值减去最小值等于间距-1,那么该可能就是符合要求的!
    code:
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
            cin>>a[i];
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            int maxx=0,minx=n+1;
            for(int j=i;j<=n;j++)
            {
                int x=a[j];
                minx=min(minx,x);
                maxx=max(maxx,x);
                if(maxx-minx==j-i||maxx==minx)
                    sum++;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
  • 相关阅读:
    $("*")选取所有的元素
    $("p") 选取多有的元素
    $(".test")选取所有class为test的元素
    $("#test")选取id为test的元素
    数据分析工具的深度对比:FineBI vs PowerBI
    Kafka是如何处理Netflix每天2万亿条消息的?
    新补丁更新(RU和RUR),新的版本(Release 18和19)
    Cinder 的 I/O QoS
    Web前端绘制0.5像素的几种方法
    Web前端绘制0.5像素的几种方法
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10488380.html
Copyright © 2011-2022 走看看