题目:有数p和n,两个人从p = 1开始,依次在p上乘上2~9中的一个数字,谁先到达或超过n就获胜,
现在给你n,判断谁获胜。
分析:博弈。对应的每一个给定的n,获胜的人是确定的。
首先,找下规律:(这里可以把多次取的数字压缩成一个整体,不影响最后的区间)
n ∈ (1,9] Stan 获胜;(S取2~9)
n ∈ (9,18] Ollie 获胜;(S取2~9,O取2~9)
n ∈ (18,162] Stan 获胜;(S取4~81,O取2~9)
n ∈ (162,324] Ollie 获胜;(S取4~81,O取4~81)
...
观察我们可以发现,状态是以18为周期循环的,设f(n)为给定数字Stan的获胜情况;
(Stan 和 Ollie的获胜情况相反,设一个函数就够了)
则有f(n)= f(n / 18)= f(n / 18 / 18)... f(k); { k < 18 }
(这里不要使用整除,会出现舍掉误差)
说明:UVa打不开,用vjudge就可以╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int main() { double n; while (cin >> n) { while (n > 18) n /= 18; if (n <= 9) cout << "Stan wins." << endl; else cout << "Ollie wins." << endl; } return 0; }
UVa 847 - A Multiplication Game
原文:http://blog.csdn.net/mobius_strip/article/details/44586769