连号区间数(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日,如 ...
随机推荐
- 简单了解 DLL中, .def 文件及C#调用C++方法
DLL中导出函数的声明有两种方式: 1.在函数声明中加上__declspec(dllexport) //以下内容为 .h 文件中的内容 //向外界提供的端口 extern"C" _ ...
- Inquirer.js
一个使用界面进行交互的命令行集合 4.0以上的版本只支持node 6以上的,node4请使用3.x 目标和理念(hilosophy) 努力去做一个容易的 嵌入式的(embeddable) 和优美的命令 ...
- vue版 文字滚动
用法:<marque :text="bannerText"></marque> 下载
- hbase的api操作之过滤器
Comparison Filter: 对比过滤器: 1.RowFilter select * from ns1:t1 where rowkey <= row100 ...
- Vue-devtools 安装浏览器调试
工欲善其事,必先利其器. 本文主要讲解Vue-devtools的安装和使用 安装方法有两个: 方法一:(前提条件需要FQ,省事省力省心方便快速) FQ =>谷歌商店 =>搜索 =>V ...
- Ubuntu gitlab安装文档及邮件通知提醒配置
1.安装依赖包,运行命令 sudo apt-get install curl openssh-server ca-certificates postfix 2.由于gitlab官方源可能被“墙”,首先 ...
- Arrlist的重要方法重写
import java.util.Arrays; public class ArrayOperator { public static void main(String[] args) { // TO ...
- 【技巧】EasyUI分页组件pagination显示项控制
我们使用easyui分页时,分页组件显示项有很多,默认如下是这样的: 有时候我们并不想显示这么多控制项,我们可以通过属性来控制:如下来自EasyUI官网: 如下写法,在datagrid中使用,如下控制 ...
- java使用SimpleDateFormat实现字符串和日期的相互转换
public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = &quo ...
- Dynamic learning rate in training - 培训中的动态学习率
I'm using keras 2.1.* and want to change the learning rate during training. I know about the schedul ...