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
分析
题目很简单,就是判断序列中是否同时有 1 和 m,有就不行,因为同时含有上下边界就不能平移得到相似曲子了。
代码
先贴一个错误代码:
#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删掉即可
评论区