连号区间数(2013年第四届c/c++ b组第10题)
题目描述
标题:连号区间数
小明这些天一直在思考这样一个奇怪而有趣的问题:
在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题)的更多相关文章
- 连号区间数|2013年蓝桥杯B组题解析第十题-fishers
连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递 ...
- java实现第四届蓝桥杯连号区间数
连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R ...
- 2013年第四届蓝桥杯javaB组 试题 答案 解析
1.世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都 ...
- 2013年第四届蓝桥杯JavaB组省赛试题解析
题目及解析如下: 题目大致介绍: 第一题到第四题是结果填空,方法不限只要得到最后结果就行 第五题和第六题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 第一题 ...
- [蓝桥杯]PREV-7.历届试题_连号区间数
问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增 ...
- 算法笔记_193:历届试题 连号区间数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R ...
- Java实现 蓝桥杯 历届试题 连号区间数
问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增 ...
- 2013年第四届蓝桥杯C/C++B组省赛题目解析
一. 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后 ...
- 第四届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.世纪末星期 题目描述 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如 ...
随机推荐
- Shiro框架配置-applicationContext里面的(仅提供借鉴)
<!-- 配置自定义realm --> <bean id="shiroAuthRealm" class="com.sykj.realm.ShiroAut ...
- 一个SQL语句的优化(sqlserver)
最早的写法: WITH T AS ( end as Flag FROM YM WHERE Col_076 BETWEEN '2018-07-25' AND '2018-08-03' AND Col_4 ...
- 在命令行启动vscode
1.windows使用 code . 命令打开vscode 1.打开vscode安装位置,进入bin文件夹,复制路径 eg:E:\Microsoft VS Code\bin:2.回到桌面,右键我的电脑 ...
- fiddler安装及mock数据
1,fiddler安装,解决无法抓到https问题 可用本机的火狐浏览器测试,不行,就fiddler生成证书,拷到火狐里 在firefox中,选项->进入配置界面:高级-> 证书 -> ...
- Case 条件运算符
Case运算有两种写法,平常用的都比较多,这里只简单复习下,Case的语法帮助里就好,这里我尝试用颜色区分的方式让大家一眼就能了解其结构: 写法一:) select case when PriceTy ...
- C#调用java包里的方法
用IKVM,步骤: 下载ikvmbin-7.2.4630.5.zip,解压,把bin目录所在路径加到环境变量path里 2.电脑开始->CMD,输入ikvmc –out:”输出dll文件的路径” ...
- 【cogs247】售票系统【线段树】
售票系统 输入文件:railway.in 输出文件:railway.out 时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路 ...
- day26_python_1124
1.内容回顾 2.验证客户端的合法性 3.block + 进度条 4.数据的输入和输出(铺垫并发编程)(操作系统基础) 5.进程的概念+sys.argv 1.内容回顾 # udp协议 和 tcp协议 ...
- CentOS 7 常用命令大全
CentOS7 常用命令集合 这两天一直在对CentOS 7.2进行初体验,各种学习命令肿么用,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样,毕竟这些都不是一家出来的嘛~ 废话不多说 ...
- html中form表单的使用方法和介绍
from表单的使用方法 一.表单赏析 二.了解表单功能:用于搜集不同类型的用户输入的内容 有了表单,网页的内容可以由用户自己创建,那么对于网页来说,我们既是网页创建都者,也是网页的消费者. 三.常用的 ...