链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
一天 AsindE 和 slwang 在玩一个回合制游戏"阿卡伊",该游戏中玩家能轮流放一次技能对敌人造成伤害,随着游戏进行,他们来到了最终关卡 ------ "Testify", 身为 BOSS 的 jbgg 在被打死后会爆金币,但只有给 jbgg 最后一击的玩家才能获得。
已知 AsindE 有 n 个技能,能分别造成 a1,a2,⋯,an 的伤害,slwang 则有 m 个技能,能分别造成 b1,b2,⋯ ,bm 的伤害,jbgg 有 x 点血量,当 x⩽0时死亡。
他们两个人都很想要 jbgg 爆的金币,由于 AsindE 请了 slwang 疯狂星期四,所以每次游戏都是 AsindE 先放技能,假设两人都能合理安排每个回合使用的技能,请问最后谁能爆 jbgg 的金币。
两人的每个技能都能重复使用。
输入描述:
第一行一个正整数 T(1⩽T⩽103)表示有 T 组数据。 每组数据有 3 行。 第一行包含三个正整数 n,m,x(1⩽n,m⩽8,1⩽x⩽2×10^3) 第二行包含 n 个正整数 a1,a2,⋯ ,an(1⩽ai⩽8)表示 AsindE 的技能可造成的伤害。 第三行包含 m 个正整数 b1,b2,⋯ ,bm (1⩽bi⩽8)表示 slwang 的技能可造成的伤害。
输出描述:
输出 T 行,每行对应一组数据。 如果 AsindE 能拿到金币,输出 AsindE。 如果 slwang 能拿到金币,输出 slwang。
示例1
输入
1 3 4 8 2 3 4 1 3 2 6
输出
slwang
示例2
输入
2 1 3 17 2 5 4 1 3 1 19 1 4 5 6
输出
slwang AsindE
分析
简单的dp,可以设f1[x] / f2[x]表示当起始血量为x时,AsindE/slwang能否得到金币(0 or 1);
显然有转移方程f1[x]= (x<=a[j]) || f2【x-a[j]】==0 (即当前血量小于等于技能伤害 或 造成a[j]伤害后slwang不能得到金币);f2(x)方程类似。
因为f1【x】与f1【x-a[j]】有关,所以x从小开始循环,在枚举每个技能j即可。
最后由于AsindE先手,则判断f1【x】即可。
复杂度:t*x*(n+m)
代码
#include<bits/stdc++.h>
using namespace std;
int a[10],b[10];
int f1[2010],f2[2010];
int main ()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
int n,m,x;cin>>n>>m>>x;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=x;i++)
{
f1[i]=f2[i]=0;
for(int j=1;j<=n;j++)
{
if(i<=a[j]||!f2[i-a[j]])f1[i]=1;
}
for(int j=1;j<=m;j++)
{
if(i<=b[j]||!f1[i-b[j]])f2[i]=1;
}
}
if(f1[x])puts("AsindE");
else puts("slwang");
}
return 0;
}