题目描述

标题:连号区间数

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

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

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

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

输入格式:
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。

输出格式:
输出一个整数,表示不同连号区间的数目。

示例:
用户输入:
4
3 2 4 1

程序应输出:
7

用户输入:
5
3 4 2 5 1

程序应输出:
9

解释:
第一个用例中,有7个连号区间分别是:[1,1], [1,2], [1,3], [1,4], [2,2], [3,3], [4,4]
第二个用例中,有9个连号区间分别是:[1,1], [1,2], [1,3], [1,4], [1,5], [2,2], [3,3], [4,4], [5,5]

解题过程(其实这道题很简单,请没思路的朋友耐心

看下去,也可以直接先看最后面的代码,很短,看完

代码或许你就懂了)

首先考虑时间复杂度:数据规模N<=50000,而我们要解这道题必定要遍

历所有的子数组,所以时间复杂度最大为N(N-1)/2,大约是12.5亿,也

就是N最大时程序要运行12秒(这还是保守估计),因为计算机每秒我

们都认为计算一亿次左右,而题目要求要在5秒之内完成,这几乎不可能

完成的,所以我们猜测实际出题者实际给出的样例并不太接近50000。

走不通的动态规划思路:

一开始解决这道题的思路是“动态规划”,所以一直在思考较小的区间与包含这个区间的较大区间之间的联系:

考虑以下样例:

[3, 4, 2, 5, 1]

显然对于包含单个元素的子数组来说肯定符合连号区间的定义,即[3],[4],[2],[5],[1]都是连号区间。

那我们来考虑[3,4]是不是连号区间是否与[3],[4]是连号区间有关,这里[3,4]、[3]、[4]恰好都是

连号区间;

再继续考虑[4,2]是不是连号区间是否与[4]、[2]是连号区间有关,显然虽然[4]和[2]都是连号区间,

[4,2]并不是连号区间,经过仔细考虑,我找不到任何可以用动态规划的痕迹,所以转换了思路。

转换思路,考虑暴力破解?用哪种方法判断一个子数组是否符合

连号区间开销最小?

还是考虑[3, 4, 2, 5, 1]这个样例,我们先把它排个序,这样看起来直观些:

[1, 2, 3, 4, 5]

由于数据元素是有序且唯一的(不存在一个数组里面有两个元素相等),所以我们会惊喜地发现

当一个数组是连号区间时,有:

数组最大值 - 数组最小值 + 1 = 数组元素个数

我们记为: max - min + 1 = len;

证明max - min + 1 = len

假设一个长度为len的数组为A = {a1, a2, a3, ..., an};

我们干脆就假设数组最小元素min = a1,假设

数组最大元素max = an;

那怎样使得A数组满足连号区间呢,根据

连号区间的定义,该数组必须要有min + 1, min + 2,...,

max - 1这些数组元素(一共max - min - 1 个数),

这样就要求数组元素必须有(max - min + 1)

个数(包括最大元素和最小元素)才能满足连号区间。

而实际上A数组不一定是有max - min + 1个数组元素的,

这种情况下A数组就不满足连号区间。

举个栗子

如果你还不明白我在说什么,那应该是我表达能力太差了,

这样吧,我们举个栗子:

考虑以下数据

[3, 4, 2, 7, 1]

这个数组最大值为7,最小值为1,那你想一想,如果要让该数组满足

连号区间的定义,必然还要有2,  3,  4, 5, 6这几个数组元素才满足对吧,

即数组元素个数必定是7个元素(包括最大值和最小值)才满足连号

区间,而[3, 4, 2, 7, 1]实际才有5个元素,这样明显[3, 4, 2, 7, 1]就不符合

连号区间的定义。

accept代码

#include <cstdio>
#include <iostream>
using namespace std;
int num[50000 + 10]; int main()
{
int count = 0;
int N;
cin >> N;
count += N; //只有一个元素的子数组明显符合条件 ,一共有N个只有一个元素的子数组
for(int i = 0; i < N; i++)
{
cin >> num[i];
} //遍历所有子数组,如果子数组满足“最大元素 - 最小元素 + 1 == 数组长度”,则说明满足连号区间条件,count++。
for(int i = 0; i < N; i++)
{
int min = num[i];
int max = num[i];
for(int j = i + 1; j < N; j++)
{
if(min > num[j])
{
min = num[j];
}
if(max < num[j])
{
max = num[j];
}
if(max - min == j - i)
{
count++;
}
}
}
cout << count << endl; return 0;
}

  

如果哪里总结错了,希望各位朋友不吝赐教!!!

连号区间数(2013年第四届c/c++ b组第10题)的更多相关文章

  1. 连号区间数|2013年蓝桥杯B组题解析第十题-fishers

    连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递 ...

  2. java实现第四届蓝桥杯连号区间数

    连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R ...

  3. 2013年第四届蓝桥杯javaB组 试题 答案 解析

    1.世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都 ...

  4. 2013年第四届蓝桥杯JavaB组省赛试题解析

    题目及解析如下: 题目大致介绍: 第一题到第四题是结果填空,方法不限只要得到最后结果就行 第五题和第六题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 第一题 ...

  5. [蓝桥杯]PREV-7.历届试题_连号区间数

    问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增 ...

  6. 算法笔记_193:历届试题 连号区间数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R ...

  7. Java实现 蓝桥杯 历届试题 连号区间数

    问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增 ...

  8. 2013年第四届蓝桥杯C/C++B组省赛题目解析

    一. 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后 ...

  9. 第四届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.世纪末星期 题目描述 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如 ...

随机推荐

  1. 一张图了解Spring Cloud微服务架构

    Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...

  2. C# interface 的隐式与显示实现及适应范围源码演示

    把代码过程中经常用到的一些代码段做个记录,如下的资料是关于C# interface 的隐式与显示实现及适应范围演示的代码. interface IAnimal { void Dog(); } clas ...

  3. 解决ajax跨域

    今天要联调项目,前后端请求使用ajax,联调存在跨域问题,解决办法如下: (1)在本地的电脑上新建一个文件夹,用于前后端联调存放浏览器 缓存的 (2)打开桌面的谷歌浏览器图标(右键>属性> ...

  4. application.xml中配置文件properties导入

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.Prop ...

  5. VNC (vnc viewer)错误修复方法

    VNC错误描述 vnc viewer开启后弹窗提示 Could not connect to session bus: Failed to connect to socket /tmp/dbus-XX ...

  6. 小程序批量获取input的输入值,监听输入框,数据同步

    在使用小程序时,跟vue的数据绑定不一样,没有v-model这个属性了,官网也只是给了一些事件监听. 但是我们如果有多个表单时,需要写多个事件来同步数据.这样做很麻烦.下面的方法可以解决,只需要一个方 ...

  7. 调用 CURL 使用正则抓取信息

    Class MyCurl{  protected $_pdo;     //构造方法 链接数据库  public function __construct(){      $this->_pdo ...

  8. RTX腾讯通字体全变成横着的了

    呵呵,简单,RTX字体选择里边的字体列表中同一种字体有些是带@符号的,有些没有带,记着选不带@号的就是头朝上的了.

  9. Ubuntu18.04下安装搜狗输入法

    Ubuntu18.04下安装搜狗输入法 第一步:安装 fcitx输入框架 sudo apt-get install fcitx 第二步:在官网下载 Linux 版本搜狗输入法 https://piny ...

  10. Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)

    项目地址https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpegv%E6%92%AD%E6%94%BE%E8%A7% ...