POJ_2505 A multiplication game(博弈,range)

题目请点我

题解:

这道题是遇到的第一道相乘的题目,考虑的是谁能先大于等于N。对于这类题目,我觉得不太容易像Nim游戏一样找到一个平衡状态。从必胜态和必败态去考虑,我们转化为一个找每个人必能达到的范围的问题。首先,对于先手来说,2~9为必胜区间,不管先手如何,后手所能达到的最小值是18,所以后手的必胜区间是10~18。之后依次类推,每次在考虑临界值的时候,每个人都是希望自己能更大,而对手是希望更小,两个人分开去考虑,所以按照自己每次乘9,对手乘2来考虑临界区间。

所以有以下结果,符合结论:

1~9 ->Stan;

10~18=2*9->Ollie;

19~162=9*2*9->Stan;

163~324=2*9*2*9->Ollie;

代码实现:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define LL long long

using namespace std;

LL N;
LL range;
int main()
{
    while( cin>>N ){
        range = 1;
        int flag = 1;
        while( range < N ){
            if( flag ){
                range *= 9;
                flag = 0;
            }
            else{
                range *= 2;
                flag = 1;
            }
        }
        if( !flag ){
            cout<<"Stan wins."<<endl;
        }
        else{
            cout<<"Ollie wins."<<endl;
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 04:00:40

POJ_2505 A multiplication game(博弈,range)的相关文章

UVA 847 - A Multiplication Game(博弈)

UVA 847 - A Multiplication Game 题目链接 题意:一个数一开始是1,每次轮流乘2-9,谁先大于n谁就赢,问谁胜 思路:博弈,找出必胜态,2-9为stan,10-18为ollie,19-162为stan...发现都是乘2乘9交替 代码: #include <stdio.h> #include <string.h> #include <math.h> long long n; bool judge(long long n) { long lon

HDU 1517 A Multiplication Game (博弈&amp;&amp;找规律)

A Multiplication Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3691    Accepted Submission(s): 2097 Problem Description Stan and Ollie play the game of multiplication by multiplying an in

HDU 1517 A Multiplication Game 博弈

A Multiplication Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6202    Accepted Submission(s): 3532 Problem Description Stan and Ollie play the game of multiplication by multiplying an in

poj 2505 A multiplication game(博弈)

还的确是一个稍有难度博弈的问题(这个可不属于博弈中的任何一个): 题意:游戏规则为:两个人在2-9选数选出之后与p相乘,此时p=p*(2...9);当p>=n时这一方获胜.. 分析: 如果输入是 2 ~ 9 ,(2~9)因为Stan 是先手,所以Stan 必胜 如果输入是 10~18 ,(9+1~9*2)因为Ollie 是后手,不管第一次Stan 乘的是什么,Stan肯定在 2 ~ 9 之间,如果Stan乘以 2 ,那么Ollie就乘以 9 ,就到18了,如果Stan乘以 9 ,那么Ollie乘

POJ2505 A multiplication game(博弈)

题意 开始时$p = 1$,每次可以乘$2 - 9$,第一个使得$p \geqslant n$的人赢 问先手是否必胜 $1 <n <4294967295$ Sol 认真的推理一波. 若当前的数为$\frac{n}{9} \leqslant x \leqslant n$,则先手必胜 若当前的数为$\frac{n}{18} \leqslant x \leqslant \frac{n}{9}$,则先手必败 若当前的数为$\frac{n}{18 * 9} \leqslant x \leqslant \

poj 2505 A multiplication game(博弈)

A multiplication game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5622   Accepted: 2811 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 =

HDU 1517 A Multiplication Game (博弈-求sg)

A Multiplication Game 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

ZJU 1893 A Multiplication Game 【简单博弈】

感觉ZJU上有不少博弈的题目. 这道题目还是比较好理解的,题目大概意思是:两人轮流乘一个2-9的数,从1开始乘,求谁的乘积先大于N. 还是寻找必败点必胜点,不过在这个题目里转换成了寻找必败区间必胜区间的问题 以输入1000为例,我们可以倒着来,每个人除2到9之间的一个数 1000 | 999 ... 112 |    若占住999到112,则对手必胜. 必须让对手占领此段. 1000 | 999 ... 112 | 111 ... 56 |   因此必占段是 111 -? .如果56被对手占住,

POJ 2505 A multiplication game(找规律博弈/贪心)

题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() { ll n; while(~scanf("%I64d",&n)) {//其实算是 贪心了吧 //先手想赢,他会x2,这样子才能尽量避免让后手赢 //后手想赢,他就会x9,只有乘最大的,他胜算才最大 int t=0; ll l=1,r=9; while(1) { if