p1045 [noip2003 普及组] 麦森数
时间: 2023-04-30 07:04:35 浏览: 96
这道题目是要求求出一个数组的马蜂数,马蜂数定义为数组中任意两个数相差为1的数对的个数。通过遍历数组,判断当前数字和前一个数字的差值是否为1,如果是,则统计一个马蜂数。最后统计完所有的数对,输出结果即可。
相关问题
P1043 [NOIP2003 普及组] 数字游戏
题目描述
有一个长度为n(n<=100)的数字串,求出其中所有的连续子串中,各个数位数字之和的最大值是多少。
输入格式
第一行是一个整数n(n<=100)。
第二行是n个数字字符。
输出格式
一个整数,表示各个数位数字之和的最大值。
样例输入
6
123123
样例输出
9
提示
此题也可用O(n)的时间复杂度求解。
算法1
(暴力枚举) $O(n^3)$
枚举出所有的连续子串,再计算它们的各位数字之和。
时间复杂度
枚举子串需要 $O(n^2)$ 的时间,每次计算各位数字之和,需要 $O(n)$ 的时间,所以总时间复杂度为 $O(n^3)$。
空间复杂度
不需要额外的空间,所以空间复杂度为 $O(1)$。
算法2
(动态规划) $O(n)$
设置一个数组 $f[i]$ 表示以第 $i$ 个位置结尾的子串中各位数字之和的最大值,那么 $f[i]$ 的值可以从两个位置转移而来:
- $f[i] = max(f[i], f[i-1] + num[i])$,即当前位置的值加上前一个位置的最大值;
- $f[i] = max(f[i], num[i])$,即当前位置的值比前一个位置的最大值更大。
转移方程为:$f[i] = max(f[i], f[i-1]+num[i], num[i])$。
时间复杂度
只需要遍历一次数组,所以时间复杂度为 $O(n)$。
空间复杂度
需要一个 $f$ 数组来记录各个位置的最大值,所以空间复杂度为 $O(n)$。
C++ 代码
算法1
p1044 [noip2003 普及组] 栈
题目描述:
给定一个长度为n的序列a1,a2,...,an,你需要使用一个栈进行排序。排序的规则为:
每次弹出一个或多个元素,这些元素都是未出栈的元素中的最小值。
按照弹出的顺序将元素输出。
例如,如果输入序列为3 1 2,则有以下两种排序方式:
先弹出元素1,再弹出元素2,最后弹出元素3,得到排序序列1 2 3;
先弹出元素2和1,再弹出元素3,得到排序序列2 1 3。
输入格式
第一行包含一个整数n。
第二行包含n个整数,表示序列a。
输出格式
输出一个序列,表示通过栈排序得到的序列。
输入样例1:
5
5 4 3 2 1
输出样例1:
1 2 3 4 5
输入样例2:
5
5 4 3 2 1
输出样例2:
1 2 3 4 5
提示
数据范围
1≤n≤1000
数据范围的原因是栈的深度不能太深,否则会栈溢出,导致程序崩溃。