UVa 847 - A Multiplication Game

题目:有数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值