上升序列问题

文章介绍了递增序列、非降序列、严格递增序列和严格递减序列的概念,并详细阐述了如何通过比较连续两个数来判断一个序列是否为严格上升序列。提供了一个C++程序示例,展示了在没有找到不满足条件的数时才能确定序列是严格上升序列的逻辑。
摘要由CSDN通过智能技术生成

概念

  1. 递增(非降)序列
    如果在序列中,每个数都不小于它前面的一个数,我们就称这个序列为递增序列,或者称为非降序列。例如:1 2 2 3 43 4 5 6 7都是非降序列。
  2. 递减(非增)序列
    如果在序列中,每个数都不大于它前面的一个数,我们就称这个序列为递减序列,或者称为非增序列。例如:4 3 3 2 17 6 5 4 3都是非增序列。
  3. 严格递增序列
    如果在序列中,每个数都大于它前面的一个数,我们就称这个序列为严格递增序列。例如:1 2 2 3 4不是严格递增序列,3 4 5 6 7为严格递增序列。
  4. 严格递减序列
    如果在序列中,每个数都小于它前面的一个数,我们就称这个序列为严格递减序列。例如:4 3 3 2 1不是严格递减序列,7 6 5 4 3为严格递减序列。

上升序列的判断

  • 每次判断的操作只比较需要连续的两个数,因此,我们除了用一个变量(例如: x x x)记录刚刚输入的数值以外,还需要用一个变量(例如: l a s t last last)记录上一个输入的数值,将这两个数值进行比较即可。

  • 由于我们是从第 2 2 2 个数开始才有 l a s t last last,因此 l a s t last last 一开始的值就是第 1 1 1 个数,我们可以直接将第一个数值输入给 l a s t last last,第 2 2 2 个数输入给 x x x。这样我们可以用 if (x > last) 语句来进行比较。

  • 当把第 3 3 3 个数输入给 x x x 时, l a s t last last 应该是第 2 2 2 个数才对,因此,我们需要在将 x x x 变为第 3 3 3 个数之前,先把它的值赋值给 l a s t last last,使其成为第 2 2 2 个数。也就是说,对于每个新输入的 x x x 来说,它之前的数值已经赋值给了 l a s t last last
    对于输入 5 5 5 个数:7 9 5 10 11

    i12345
    x7951011
    last79510

    从第 2 2 2 列开始,每一列的 x x x l a s t last last 刚好就是一对相邻的数,我们对它们使用 if (x <= last) 语句进行比较即可。

  • 如何判断一个序列不是严格上升序列?或者是上升序列?
    假如存在某一次判断 x ≤ l a s t x \le last xlast,则 if (x <= last) 语句为真,立即可以判断该序列不是严格上升序列;
    但是,如果对于某一次 if (x <= last) 为假,能立即判断它就是严格上升序列吗?显然不能! 正如上面的例子,在第 2 2 2 列里 if (x <= last) 就为假,但它绝不是严格上升序列,因为你才刚刚看了前两个数,后面的数很有可能存在 if (x <= last) 为真的情况,其实第 3 3 3 列就为真!所以,我们不能用 if-else 直接通过某一列就得出“要么为严格上升序列,要么不是严格上升序列”的结论。这种判断以后我们也会经常见到,它的特点就是:只要有一个为真,则输出 NO;必须全部为假,才为 YES。

所以,只有在循环外,当整个循环都没有判断为真的情况时,才能确定这是一个严格上升序列。

#include <iostream>
using namespace std;
int main(){
	int n, x, last;
	//第一个数直接被赋值为last
	cin >> n >> last;//省略了last = x
	for (int i = 2; i <= n; ++i) {
		cin >> x;
		// 判断不是上升序列的条件
		if (x <= last) {
			cout << "NO";
			// 此时整个程序即可结束
			return 0;
		}
		last = x;
	}
	// 整个循环都没有if为真,则输出'YES'
	cout << "YES";
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值