斗地主大师
时间限制:1000ms 内存限制:65536kB
描述
斗地主大师今天有P个欢乐豆,他夜观天象,算出了一个幸运数字Q,如果他能有恰好Q个欢乐豆,就可以轻松完成程设大作业了。
斗地主大师显然是斗地主大师,可以在斗地主的时候轻松操控游戏的输赢。
1.他可以轻松赢一把,让自己的欢乐豆变成原来的Y倍
2.他也可以故意输一把,损失X个欢乐豆(注意欢乐豆显然不能变成负数,所以如果手里没有X个豆就不能用这个能力)
而斗地主大师还有一种怪癖,扑克除去大小王只有52张,所以他一天之内最多只会打52把斗地主。
斗地主大师希望你能告诉他,为了把P个欢乐豆变成Q个,他至少要打多少把斗地主?
输入
第一行4个正整数 P,Q,X,Y 0< P,X,Q <= 2^31, 1< Y <= 225
输出
输出一个数表示斗地主大师至少要用多少次能力 如果打了52次斗地主也不能把P个欢乐豆变成Q个,请输出一行 “Failed”
样例输入
样例输入1
2 2333 666 8
样例输入2
1264574 285855522 26746122 3
样例输出
输出样例1:
Failed
输出样例2:
33
题解
首先按要求输入p,q,x,y。注意它们上限为2^31,必须用long long定义
long long p,q,x,y;
cin>>p>>q>>x>>y;
其次以p(欢乐豆的数量)为参数宽搜
bfs(p);
void bfs(int a)//为避免重名,参数名定义为a
{
}
宽搜的队列需要记录两个值:现有欢乐豆数、当前局数。且欢乐豆数上限超出int上限,要用long long定义
struct node
{
long long n,d;//n:当前欢乐豆数 d:当前局数
};
queue<node> qu;
我们还需要一个标记数组,避免重复搜索
map<long long,int> m;
接下来我们回到函数,将初值加入队列并标记
qu.push({
a,0});
m[a]=1;
这里有一种要考虑的特殊情况:现有的欢乐豆数p正好等于幸运数q。这种情况直接输出0
if(a==q)//之前用a记录的p
{
cout<<0