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
     
    思路:开始没读懂题,后来才发现求得只是这一个数列的符合条件的区间个数。这样的话,据说,如果这个区间的最大值和最小值之差刚好是区间长度,那么这个区间就一定是可以连续递增了。【脑洞正大,但不是我开的T_T】
    而且,10^5的数据范围,两层for循环没有TLE什么鬼啊~~~
    附right代码:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    int num[60000];
    
    int main() {
        int n;
        int ans;
        while (cin >> n) {
            ans = 0;
            for (int i=0; i<n; ++i) {
                cin >> num[i];
            }
    
            int maxn = 0, minn = n+1;
    
            for (int i=0; i<n; ++i) {
                maxn = 0, minn = n+1;
                for (int j=i; j<n; ++j) {
                    minn = min(minn, num[j]);
                    maxn = max(maxn, num[j]);
                    if (maxn - minn == j-i) {
                        ans++;
                    }
                }
            }
    
            cout << ans << endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    上周热点回顾(3.13.7)
    博客园电子期刊2010年1月刊发布啦
    博客园电子期刊2010年2月刊发布啦
    上周热点回顾(2.222.28)
    Android 专题上线
    聊聊2010年春晚
    上周热点回顾(3.83.14)
    博客园上海俱乐部活动通知(20100320)
    上周热点回顾(2.12.7)
    博客园图灵杯第4届博问大赛(2010.2.27~2010.3.27)
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5263015.html
Copyright © 2011-2022 走看看