HDOJ 1517A Multiplication Game(巴士博弈)

A Multiplication Game

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4726    Accepted Submission(s): 2685


Problem Description
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches p >= n.
 

Input
Each line of input contains one integer number n.
 

Output
For each line of input output one line either  

Stan wins.  

or  

Ollie wins.

assuming that both of them play perfectly.
 

Sample Input
  
  
162 17 34012226
 

Sample Output
  
  
Stan wins. Ollie wins. Stan wins.
 

  此题目也是巴士博弈的一种,不过只是不是用的乘法了,与原来的加和确实有很大不同,但是本质上还是讨论谁先达到某一个数值,所用的数是在一个区间。

  初始的区间是2 to 9,如果n<=9,先手一定赢,如果大于9,必定会有一个界值。如果先手先选的是2,那么后手最大能选9,此时如果9<n<18,假设n=18,先手无论选2 to 9的任何一个数,后手都能达到十八则后手赢;如果n稍微大于18,则肯定是先手赢。此时n=18就是临界值;

  所以【2,9】,【10,18】是两个原始区间,前者是先手的必胜区间,后者是后手的必胜区间,若再度延伸,则区间应该,【19,162】有是先手的必胜区间,【163,324】又是后手的必胜区间。

  则前先手的必胜区间为【2*(18)^x,9*(18)^x】,后手的是【10*(18)^x,18*(18)^x】,则可以把n一直除以18,直到n<=18,再进行判断。

#include<iostream>
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、付费专栏及课程。

余额充值