zoukankan      html  css  js  c++  java
  • 51nod--1072 威佐夫游戏 (博弈论)

    题目:

    1072 威佐夫游戏
    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
    有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
    例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
    第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 2000000)
    Output
    共T行,如果A获胜输出A,如果B获胜输出B。
    Input示例
    3
    3 5
    3 4
    1 9
    Output示例
    B
    A
    A

    分析:

    这个是有个定理的。。 威佐夫博奕。
    对于 给定的 (a, b), 如果 b = a + int ((1 + sqrt(5))/2 * (b-a))
    则这个情况是奇异局势, 后手赢。 否则先手赢。
    

    具体证明: 点我萌萌哒

    实现:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef unsigned long long LL;
    
    int main() {
        int t, a, b;
        cin >> t;
        while(t--) {
            cin >> a  >> b;
            if (a > b) swap(a, b);
            LL cd = b - a;
            LL ns = LL((1.0 + sqrt(5.0)) * cd / 2.0);
            if(ns == a) cout << "B
    ";
            else cout << "A
    ";
        }
    }
  • 相关阅读:
    poj1830 开关问题
    poj1681 Painter's Problem
    poj1222 EXTENDED LIGHTS OUT
    bzoj1923 [Sdoi2010]外星千足虫
    bzoj1013 [JSOI2008]球形空间产生器sphere
    poj2888 Magic Bracelet
    poj2409 Let it Bead
    poj1286 Necklace of Beads
    bzoj1004 HNOI2008 Cards
    bzoj2040 [2009国家集训队]拯救Protoss的故乡
  • 原文地址:https://www.cnblogs.com/aoxuets/p/5506841.html
Copyright © 2011-2022 走看看