Loading

题解 AT4532 【Stones】

分析

这道题是一道博弈论的题目,但是那个东西太难了,本蒟蒻不会,所以就用一个类似DP的东西做这道题。

我们先考虑一个极限的情况:当前一块石头都没有,所以我们的先手必败,进一步推广后,如果第\(i\)颗棋子先手必败,那么第\(i+a_j(1\leq j\leq n)\)颗棋子先手必胜,这就类似于一个DP

换一种写法就是\(dp_i=!dp_{i-a_j}\),代码就可以轻松地写出来了。

Code

#include <bits/stdc++.h>
using namespace std;
const int MAXK = 100000 + 10;
int n, k, dp[MAXK], a[100 + 10];
int main()
{
	cin >> n >> k;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	dp[0] = 0;
	for(int i = 1; i <= k; i ++)
	{
		for(int j = 1; j <= n; j ++)
		{
			if(i - a[j] < 0) continue;
			if(dp[i - a[j]] == 0) dp[i] = 1;
		}
	}
	if(!dp[k]) cout << "Second";
	else cout << "First";
	return 0;
}
posted @ 2021-01-28 17:17  zhangwenxuan  阅读(101)  评论(0)    收藏  举报