链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
一天,hh在上楼时记得他走过了a个编号为奇数的台阶和b个编号为偶数的台阶,但是他怀疑他的记忆出现了偏差。现在需要你验证是否存在两个台阶,它们之间包含了a个编号为奇数的台阶和b个编号为偶数的台阶。hh非常的懒不想思考这个问题,你能帮他解决吗?
输入描述:
第一行是一个整数T, 代表有T组数据。(1≤T≤100)。
接下来T行每行两个整数a,b(0≤a,b≤100) ,一个是编号为奇数的台阶个数,另一个是编号为偶数的台阶个数。
输出描述:
如果有a个编号为奇数的台阶和b个编号为偶数的台阶则输出"YES",否则输出"NO"。
示例1
输入
1
2 3
输出
YES
分析
本题的意思是,在一段楼梯之间,有多少个编号为奇数和编号为偶数的台阶。系统给你T组数据,你要判断哪些数据可能在一段楼梯里。注意:题目里没有明确说明楼梯的起始和终止的台阶编号。
这道题的难点在于对于题目的理解,可能有些人对编号的含义不理解。我觉得可以将其换做成数列来想象。
假设有一段数列,我们任选取其中一小段,然后观察所选的一小段数列里奇数偶数的数量情况。
结果分为三种情况:
- 若所选的一小段数列的总数为奇数,则要根据起始的数字来判断。
- 若起始数字为奇数,则所选的一小段数列内奇数的数量比偶数多1
- 若起始数字为偶数,则所选的一小段数列内奇数的数量比偶数少1
2.若所选的一小段数列的总数为偶数,则不管起始的数字是奇数还是偶数,所选的一小段数列内奇数和偶数的数量是一样多。
综上所述
奇数的数量可能比偶数多1,可能比偶数少1,也可能等于偶数,
即:
a == b + 1 || a == b - 1 || a == b
优化一下,也可以写成:(奇数的数量减去偶数的数量) 等于 1 或 -1 或 0
即:
a - b == 1 || a - b == -1 || a - b == 0
换成绝对值来写:(奇数的数量减去偶数的数量)的绝对值 等于 1
求绝对值的函数:
abs() 头文件:<stdlib.h> 或者 <math.h>
labs() 头文件:<stdlib.h> 或者 <math.h>
fabs() 头文件:<math.h>
还有
PS:平时 abs() 和 fabs() 就足够用了,其他的了解了解就行了。
这里用 abs() 或者 fabs() 都可以,用fabs() 会进行自动类型转换。
换成绝对值来写:
abs( a - b ) <= 1
因此,可以通过类比得知,奇数编号台阶的数量(a)和偶数编号台阶的数量(b)如果不在上述3种情况之中的话(即:不满足条件式语句),就可以判断为数据出错,不存在这样的楼梯,hh的记忆出现偏差,即输出"NO"。
完整代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
int n, a, b;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d", &a, &b);
if (abs(a - b) <= 1)
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}