<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    取石子游戲

    Posted on 2007-10-31 18:11 ZelluX 閱讀(1755) 評論(2)  編輯  收藏 所屬分類: Algorithm

    問題:
    有兩堆石子,數量任意,可以不同。游戲開始由兩個人輪流取石子。游戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最后把石子全部取完者為勝者?,F在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都采取最好的策略,問最后你是勝者還是敗者。

    碰到這道題時我的思路:

    設集合A, B分別為先手能贏和后手能贏的二元無序對(x,y)的集合

    先從最基礎的開始考慮,(n,0) (n,n) 屬于A,因為這樣的情況先手肯定能贏(n為正整數,下同)

    如果存在(a,b),對于一切n,(a-n,b-n)均屬于A,則(a,b)屬于B
    很容易找到一個(2,1),這是后手肯定能贏的情況

    接下來從先手的角度分析,如果他能在移動石子后留給對手(2,1)個石子,那么他就能贏,于是
    (2+n,1) (2+n,1+n) (2,1+n) 均屬于 A

    找出一個不屬于A的最小對,(5,3), 這個元素肯定屬于B集合,因為從中任意取出元素后的結果肯定屬于A集合
    相應的,(5+n, 3) (5, 3+n), (5+n, 3+n) 均屬于A

    這時發現,B集合相對A集合元素少很多,只要找出B集合中元素的特征,就能解決這個問題。

    一旦B中包含(x,y)對,A中就會相應的包含(x, y+n), (x+n, y), (x+n,y+n)
    由此想出一種構造B集合的方法,設當前構造出的集合為S,a為不在S中的最小的數,即
    a = MIN{ x | x 不屬于 (p, q), 對于一切(p, q)屬于S }
    則把(a, a+gap)加入B中,其中gap是當前S中所有對之差的最小值+1
     
     構造出的序列為
     (1,2) -> (3, 5) -> (4, 7) -> (6, 10)
     
     到這里這道題目應該已經能過了,不過還有一種達到O(1)的優化,接下來的就不是我想出來的了 =,=
     首先是Betty定理:
     如果無理數alpha, beta滿足
     1. alpha, beta > 0
     2. 1/alpha + 1/beta = 1
     那么,序列{[alpha*n]}和{[beta*n]}構成自然數集的一個分劃,其中[]是取整函數
     
     這道題對應的alpha和beta分別是(1+sqrt(5))/2,(3+sqrt(5))/2,其實是一個黃金分割



    #include <iostream>
    #include 
    <cmath>

    using namespace std;

    int main()
    {
        
    int x, y;
        
    double alpha = (1.0 + sqrt(5.0)) / 2.0;
        
    double beta = (3.0 + sqrt(5.0)) / 2.0;
        
    while (cin >> x >> y) {
            
    if (x > y) {
                
    int temp = x;
                x 
    = y;
                y 
    = temp;
            }

            
    int n = ceil(y / beta);
            
    int x1 = alpha * n;
            
    int y1 = beta * n;
            
    if (x == x1 && y == y1)
                cout 
    << 0 << endl;
            
    else
                cout 
    << 1 << endl;
        }

        
    return 0;
    }



    評論

    # re: 取石子游戲  回復  更多評論   

    2007-10-31 21:30 by Rex Mao
    這題在ACM里坐過,當時只知道公式,沒想過原理。

    # re: 取石子游戲  回復  更多評論   

    2007-11-01 11:40 by ZelluX
    @Rex Mao
    這題應該是某屆NOI的題目,也被放到了POJ上
    主站蜘蛛池模板: 亚洲三级电影网址| 免费又黄又爽又猛的毛片| 人人狠狠综合久久亚洲婷婷| 无遮挡a级毛片免费看| 国产精品嫩草影院免费| 亚洲欧美成人一区二区三区| 毛片免费vip会员在线看| 91丁香亚洲综合社区| 18勿入网站免费永久| 中中文字幕亚洲无线码| 啦啦啦手机完整免费高清观看| 亚洲日韩精品无码专区加勒比| 女人毛片a级大学毛片免费| 国产精品无码亚洲精品2021| 四虎永久免费网站免费观看| 一级午夜a毛片免费视频| 亚洲人成网站在线播放vr| 国产精品偷伦视频观看免费| 久久亚洲国产精品成人AV秋霞| 一个人免费观看在线视频www| 亚洲人片在线观看天堂无码| 免费一级e一片在线播放| eeuss草民免费| 久久亚洲AV成人无码国产| 国国内清清草原免费视频99| 亚洲av纯肉无码精品动漫| 亚洲熟妇中文字幕五十中出| 啦啦啦完整版免费视频在线观看 | 久久国产乱子伦精品免费不卡| 亚洲一区二区三区四区在线观看| 国产高清免费视频| 男性gay黄免费网站| 亚洲国产成人高清在线观看| 美女视频黄的全免费视频网站| 精品久久久久久久久亚洲偷窥女厕| 国产精品亚洲美女久久久| 最近中文字幕完整版免费高清| 亚洲av无码一区二区三区人妖 | 亚洲成a人一区二区三区| 久久99国产乱子伦精品免费| 含羞草国产亚洲精品岁国产精品|