牛客小白賽7 B自殺遊戲 (博弈論,SG函式)
阿新 • • 發佈:2018-12-11
時間限制: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; }