【题解】 CF 1257B

题目链接

题目描述

对于一个正整数\(a\),有两种操作:

  1. 如果\(a\)是偶数,可以将其变为\(\frac{3a}{2}\);

  2. 如果\(a\)大于1,可以将其变为\(a - 1\)

给出两个数\(x\)\(y\)问能否通过以上操作将\(x\)变成\(y\)

刚看到这题,我就想这不就是个\(bfs\)吗,于是便写了一个,结果样例最后一个大数据直接卡死。我便意识到这肯定不是搜索。一看\(CF\)的标签,嗯,math。诶等等,math这题原来不是搜索?于是便企图想用几个判断搞定。

首先,由于\(x、y\)都大于等于1,并且可以变为\(a - 1\),很容易就能推断出当\(x \ge y\)是一定能成功。接下来就是判断当\(x < y\)的时候。显然,如果\(x = 1\),那么一定不行,因为这时什么都做不了。然后我们要判断这个\(\frac{3a}{2}\)。如果我们让\(x\)一直\(\times 3 \div 2\),最终能大于\(y\),那么就一定可行。那什么时候\((\frac{3}{2})^kx\)(\(k\)为任意整数)永远不会变大呢?很显然,只有\(a \le 3\)时。我们只要加一个特判就行了。


以下是代码:

// 1257B Magic Stick
#include <cstdio>

int t,x,y;
bool flag; // 判断可不可以

int main() {
    scanf("%d",&t);
    for(;t;t --) {
        flag = true; //初始化
        scanf("%d%d",&x,&y);
        if(x >= y) { // 如果仅凭借a - 1可以的话
            puts("YES");
            continue;
        }
        if(x == 1) flag = false; // 特判x = 1
        if(x <= 3 && y > 3) flag = false; // 如果x <= 3,就永远达不到比3大的y
       // 这里要注意,如果不加判断y > 3,就会被2 3这组数据卡掉
        flag ? puts("YES") : puts("NO"); // 三目运算符
    }
    return 0; // 完美结束
}

评测记录


其实这题总体并不难,主要考的是你看不看算法标签大家的思维能力。所以说我们要多喝六个核桃,补脑子!

猜你喜欢

转载自www.cnblogs.com/Sky-Dreamer/p/solution-codeforces-1257B.html