标签:空间 codeforce bit highlight oid namespace ali 存在 i++
解法一:
由题意可知对于每一个位置,只要能走到一个先手必输的位置,则先手必赢;已知0为先手必输位置,遍历1-n,依次确定;时间复杂度为o(TN) , 空间复杂度o(N).MLE,TLE , 所以做题不仅要关注时间复杂度,还要关注空间复杂度;
#include<bits/stdc++.h> using namespace std; void solve(); int main() { int T; cin >> T; for (int t = 0; t < T; t++) solve(); return 0; } void solve() { int n, k; cin >> n >> k; vector<int> state(n + 1, 0); for (int i = 1; i <= n; i++) { if ((i - 1 >= 0 && state[i - 1] == 0) || (i - 2 >= 0 && state[i - 2] == 0) || (i - k >= 0 && state[i - k] == 0)) state[i] = 1; } if (state[n] == 1) cout << "Alice" << endl; else cout << "Bob" << endl; return; }
解法二:(啊,这个好难想,怎么找到规律 , 当存在一种不确定的时候,可以看与其余确定条件的关系找规律。双人博弈游戏最重要的就是找出必输态或者必赢态)
当只有1,2种move的时候,(0 , 3 , 6 , 9.....3x)的位置为先手必输位置,其余为先手必胜位;
当k%3 != 0 时,要么为1,要么为2,则3x为先手必输位,其余为先手必胜位;
当k%3==0时 , 当i<k时,i%3==0为先手必输位,i == k时,是先手必胜位。k+1为先手必输位,将n根据k+1分块, n %= k + 1 ; if(n == 0)先手必输,如果n == k先手必赢,其余的如果n%3==0则先手必输,否则就先手必赢;
#include<bits/stdc++.h> using namespace std; void solve(); int main() { int T; cin >> T; for (int t = 0; t < T; t++) solve(); return 0; } void solve() { int n, k; cin >> n >> k; if (k % 3 != 0) { if (n % 3 == 0) cout << "Bob" << endl; else cout << "Alice" << endl; } else { n %= (k + 1); if (n == k || n % 3 != 0) cout << "Alice" << endl; else cout << "Bob" << endl; } }
标签:空间 codeforce bit highlight oid namespace ali 存在 i++
原文地址:https://www.cnblogs.com/mychen06/p/12604067.html