标签:空间 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