题目描述

标题:连号区间数

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

在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;
}

  

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

转载于:https://www.cnblogs.com/linguosen/p/10534627.html

连号区间数(2013年第四届c/c++ b组第10题)相关推荐

  1. 征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费

    大臣的旅费 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市.为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  2. 征战蓝桥 —— 2013年第四届 —— C/C++A组第7题——错误票据

    标题:错误票据 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误 ...

  3. 征战蓝桥 —— 2013年第四届 —— C/C++A组第8题——买不到的数目

    买不到的数目 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖 ...

  4. 征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式

    标题:逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆 ...

  5. 征战蓝桥 —— 2013年第四届 —— C/C++A组第9题——剪格子

    剪格子 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数, ...

  6. 征战蓝桥 —— 2013年第四届 —— C/C++A组第5题——前缀判断

    题目标题:前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 ...

  7. 征战蓝桥 —— 2013年第四届 —— C/C++A组第4题——颠倒的价牌

    标题: 颠倒的价牌 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店.其标价都是4位数字(即千元不等).小李为了标价清晰.方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了 ...

  8. 征战蓝桥 —— 2013年第四届 —— C/C++A组第3题——振兴中华

    标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子.地上画着一些格子,每个格子里写一个字,如下所示: 比赛时,先站在左上角的写着"从"字的格子里,可以横向或纵向 ...

  9. 历届试题 连号区间数

    试题 历届试题 连号区间数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区 ...

最新文章

  1. Waymo无人卡车高调重返凤凰城,但货运先机已失
  2. Spring mvc-kaptcha 验证码
  3. window下建立vue.js项目
  4. 常用的好用的window工具
  5. python json串中文乱码问题
  6. LeetCode —— 897. 递增顺序查找树(Python)
  7. gho镜像安装器linux,Ghost镜像安装器
  8. 操作系统–银行家算法c语言代码
  9. 网页自动填表html,韶关网页自动填表基础教程从简单开始 - MutouSoft - 时间财富网...
  10. 基于计算机视觉原理的自主足球机器人位置规划,基于计算机视觉原理的自主足球机器人位置规划...
  11. 关于PDF文件加密无法打印的问题
  12. edem颗粒替换_Altair EDEM Professional 2020.2安装教程(附替换补丁)
  13. digester_Apache Digester示例–轻松配置
  14. webView系列(五)----历史记录
  15. Comet OJ - 2019国庆欢乐赛(赛后整理)
  16. Microsoft Office Visio的功能/价值及不足
  17. 银行卡号定位(python3)
  18. 耳机不分主从是什么意思_不疯魔不成活!红魔TWS蓝牙耳机告诉你什么是“低延怪兽”...
  19. 盘点 | 2020年网络新技术及人工智能在网络安全领域的特点
  20. De Bruijn 序列生成的本原多项式方法

热门文章

  1. cgi、wsgi、uwsgi 与 uWSGI
  2. Linux学习笔记(3)linux服务管理与启停
  3. python实现跨excel的工作表sheet之间的复制
  4. VS2015 将*.xaml.cs文件包裹在*.xaml文件下
  5. 20165310 Java实验五《网络编程与安全》
  6. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
  7. 37 | 案例篇:DNS 解析时快时慢,我该怎么办?
  8. c语言条件编译的例子,C语言条件编译分析实例
  9. Vsftpd服务的部署及优化
  10. 进程调度之最短作业优先