连号区间数(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日,如 ...
随机推荐
- C#实现基于ffmpeg加虹软的人脸识别demo及开发分享
对开发库的C#封装,屏蔽使用细节,可以快速安全的调用人脸识别相关API.具体见github地址.新增对.NET Core的支持,在Linux(Ubuntu下)测试通过.具体的使用例子和Demo详解,参 ...
- h5视频播放
h5视频播放 一直在写js原生的东西,感觉总是停滞不前,现在我们应该学一些h5新的特性,因为我们毕竟是从事前端的,下面我们一起来写一个视频播放吧 1,html <div class=" ...
- 基于百度通用翻译API的一个翻译小工具
前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发 ...
- Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题
1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法 父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...
- Lua 循环与流程控制
1.Lua 语言提供了以下几种循环处理方式: 循环类型 描述 while 循环 在条件为 true 时,让程序重复地执行某些语句.执行语句前会先检查条件是否为 true. for 循环 重复执行指定语 ...
- python 基础语法练习回顾
#!/usr/bin/python# -*- coding: UTF-8 -*-import timeimport calendar student = {"age": 7,&qu ...
- tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决
现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...
- react-native-router-flux
这是一个路由,可以用来做Android底部的导航栏,学Android的都知道,如果用原生的代码来 做导航栏,会很复杂,关系到很多复杂的知识. 接下来我就简单的说明一下如何插入和使用吧: 1.你要先依赖 ...
- Android Studio中使用Git进行代码管理(分支、合并)
打开Android Studio选择,选择从Git检出代码 也可以从VCS如下点击 去远程仓库复制地址,这里以码云Gitee第三方代码托管为例,类似Github的界面,点击右边复制项目地址 填一下配置 ...
- Property Exercise
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构 3 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件 ...