codeforces 1194 D. 1-2-K Game

解法一:

由题意可知对于每一个位置,只要能走到一个先手必输的位置,则先手必赢;已知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;
	}
}

  

猜你喜欢

转载自www.cnblogs.com/mychen06/p/12604067.html