1. 程式人生 > >牛客小白賽7 B自殺遊戲 (博弈論,SG函式)

牛客小白賽7 B自殺遊戲 (博弈論,SG函式)

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld

題目描述

Alice和Bob產生了不可調節的矛盾,於是他們相約一起玩一個自殺遊戲,輸的人就會從這個世界上消失。 遊戲開始時,Alice手上拿著一個定時炸彈,炸彈有個倒計時t。炸彈在t=0時刻會爆炸,此時手上拿著炸彈的人會從這個世界上消失。為了增加遊戲樂趣,他們約定每個人拿到炸彈後可以選擇將炸彈的時間調快d秒(d ∈ [a,b]),或者不調。每次交換炸彈會消耗1秒(假設調節炸彈時間不需要消耗時間)。 問題來了,如果雙方都足夠聰明,誰會活下去呢?

輸入描述:

第一行有三個整數t,a,b,分別表示炸彈初始時刻的倒計時,可調節時間的範圍。(0 ≤ t ≤ 105,1 ≤ a ≤ b ≤ 10)

輸出描述:

若Alice存活則輸出"Alice",若Bob存活則輸出"Bob"。

示例1

輸入

複製

6 3 4

輸出

複製

Alice

說明

Alice只需要將炸彈調快3秒後再給Bob,Bob就會拿到一個2秒後爆炸的炸彈。

記得每次調節後交換的1S要考慮到 f 數組裡,還有a,b範圍

#include<bits/stdc++.h>
//#include <iostream>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 100005
#define inf 1e18
typedef long long ll;
const ll mod = 1e9+7;
ll t,a,b,sg[maxn],f[15];
bool s[maxn];
void getsg(ll x)
{
    for(ll i = 1;i <= x; i++)
    {
        memset(s,0,sizeof(s));

        for(ll j = a-1; f[j]<=i && j<=b; j++)
            s[ sg[ i-f[j]  ]   ] = 1;

        for(ll j = 0; ; j++)
            if(!s[j])
            {
                sg[i] = j;
                break;
            }
    }

    return ;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    cin >> t >> a >> b;

    for(ll i = a; i <= b; i++) //注意
        f[i] = i+1;

    f[a-1] = 1;

    getsg(maxn);

    if(sg[t])
        cout << "Alice" << endl;
    else
        cout << "Bob" << endl;

    return 0;
}