jbgg爆金币咯【博弈、记忆化搜索】

说明在代码里。

#include <bits/stdc++.h>
#define ll long long
#define ls (p << 1)
#define rs (p << 1 | 1)
#define inf 0x3g3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef pair<int, int> PII;
const int N = 2005, p = 1e9 + 7;
int f[2][N], a[2][9], n[2];//f表示谁要走这一步,血量是多少,胜负情况如何,a是两者的技能
bool dfs(int x, int flag) {//当前的血量
	if (x <= 0) return 0;//当前血量<=0还要走的话是必败点
	if (f[flag][x] != -1) return f[flag][x];//有记录就不搜了
	for (int i = 1; i <= n[flag]; i++) {//遍历所有技能看看能否成为必胜点
		if (!dfs(x - a[flag][i], flag ^ 1)) return f[flag][x] = 1;//^交换先手权
	}
	return f[flag][x] = 0;//如果找不到必胜点就是必败点
}
void solve() {
	memset(f, -1, sizeof(f));
	int x;
	cin >> n[0] >> n[1] >> x;
	for (int i = 1; i <= n[0]; i++) cin >> a[0][i];
	for (int i = 1; i <= n[1]; i++) cin >> a[1][i];
	cout << (dfs(x, 0) ? "AsindE\n" : "slwang\n");
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值