测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40957. 斗地主大师

填空题 困难

题目描述

斗地主大师

题目描述

斗地主大师今天有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

提示

可以考虑深搜 要用long long

参考答案

#include<bits/stdc++.h> using namespace std; class Solution { private: int P; int Q; int X; int Y; int min_ok_play_count; //最少需要打多少次牌 int max_play_count; //打牌的最大次数 //t:当前有多少个欢乐豆 void dfs(int step, long long t){ if(step > 52) return; //剪枝,如果t大于Q的时候再翻Y倍,那么后面全是X操作都没用 if(t > Q + (52 - step) * X) return; if(t == Q) { min_ok_play_count = min(min_ok_play_count, step); return; } dfs(step + 1, t * Y); if(t > X) dfs(step + 1, t - X); } public: void load(int max_play_count){ scanf("%d%d%d%d", &P, &Q, &X, &Y); //printf("%d %d %d %d ", P, Q, X, Y); this->max_play_count = max_play_count; } void play_count(){ //设置比52大,用来判断52次内P变成Q是否可行 min_ok_play_count = max_play_count + 100; dfs(0, P); if(min_ok_play_count == max_play_count + 100){ printf("Failed"); }else{ printf("%d", min_ok_play_count); } } }; int main(){ #ifdef LOCAL freopen("202209_5_2.in", "r", stdin); #endif Solution s; s.load(52); s.play_count(); return 0; }
上一题 下一题