目 录CONTENT

文章目录

If 和 else if

千年的霜雪
2024-03-23 / 0 评论 / 1 点赞 / 14 阅读 / 0 字 / 正在检测是否收录...

if 和 else if

记录一个很小但是很难查出来的问题

题目

白垩色的王子所在的世界一共有 m 个调,分别是 1∼m ,而一首曲子可以抽象为一个有 n 个元素的数组 a ,其中的一个元素 a_i 表示该曲中第 i 个音符的音调。
对于两首曲子(即两个数组) a,b,我们认为这两首曲子是相似的当且仅当对于任意一个 2 \le i \le n,都有 a_i - a_{i - 1} = b_i - b_{i - 1}
对于两首曲子 a, b,我们认为这两首曲子是完全相同的的当且仅当对于任意一个 1 \le i \le n,都有 a_i = b_i
现在给出一首曲子 a,询问是否存在一首与其不完全相同的曲子 b 与其相似。

输入描述

第一行输入两个整数 n,m (1 \le n,m \le 10^6),意义如题面所示。

第二行输入 n 个整数,第 i 个整数表示曲子中第 i 个音符的音调 a_i (1 \le a_i \le m)

输出描述

若存在一首与其不完全相同的曲子 b 与其相似,输出一行 "Yes",否则,输出一行 "No"(不含引号)。

示例

示例1:

输入

5 5
2 3 1 4 4

输出

Yes

说明:

存在曲子 b:3,4,2,5,5 符合要求。

示例2:

输入

8 7
1 6 4 3 3 5 7 2

输出

No

分析

题目很简单,就是判断序列中是否同时有 1m,有就不行,因为同时含有上下边界就不能平移得到相似曲子了。

代码

先贴一个错误代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <stdio.h>

using namespace std;

int m, n;
bool low, top;

int main()
{
	cin >> n >> m;

	while(n--)
	{
		int tmp = 0;
		scanf("%d", &tmp);
		if (tmp == 1) low = true;
		else if (tmp == m) top = true;
	}
    
	if (low && top) printf("No\n");
	else printf("Yes\n");
	return 0;
}

这段代码就是使用的上面的思路写出来的,保证了样例都能过,乍一看好像没什么问题;
但就是else if这里,如果使用else if,就代表默认了每次循环只能进入if和else if中的一个,即默认在同一个循环中1和m一定不同;
所以当输入

1 1
1

时,就会出问题

所以正确代码就是把else删掉即可

1

评论区