题目描述
对于一个正整数\(a\),有两种操作:
如果\(a\)是偶数,可以将其变为\(\frac{3a}{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; // 完美结束
}
其实这题总体并不难,主要考的是你看不看算法标签大家的思维能力。所以说我们要多喝六个核桃,补脑子!