HDU1729 Stone Game (SG函式)

bigbigship發表於2015-04-01

題目連結:

http://acm.hdu.edu.cn/showproblem.php?pid=1729


題意:

又n個盒子,每個盒子的可以放 S個石頭,裡面已經有的石頭的個數為C;

每次可以放的石頭的個數不超過C*C。先手勝的輸出Yes,後手勝輸出No.


分析:

必敗的狀態很好找 當C + C * C < S && (C + 1) + (C + 1) * (C + 1) > = S;

然後我們對於每一組(c,s)來尋找他的必敗狀態。

列舉for(i = 1 ; i + i * i > = s;i++)

然後將 i 與 c 進行比較,

如果 c > i, 那麼這是一個必勝的狀態 sg值為  s - c;

這點不懂得可以看看這個 http://blog.163.com/scuqifuguang@126/blog/static/171370086201101711276278/

如果  c == i , 那麼必敗。

如果 c < i  將i 看成 S 繼續遞迴求解


程式碼如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int get(int c,int s){
    int q=0;
    while(q+q*q<s)
        q++;
    q--;
    if(c>q) return s-c;
    else return get(c,q);
}

int main()
{
    int n,cas=1;
    while(~scanf("%d",&n)&&n){
        int s,c,ans=0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&s,&c);
            ans^=get(c,s);
        }
        printf("Case %d:\n",cas++);
        if(ans) puts("Yes");
        else   puts("No");
    }
    return 0;
}




相關文章