牛客竞赛习题:走楼梯 [C语言解法]

发布于:2022-11-07 ⋅ 阅读:(12) ⋅ 点赞:(0) ⋅ 评论:(0)

链接:登录—专业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
  • 若起始数字为偶数,则所选的一小段数列内奇数的数量比偶数少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;
}