AT_dp_k Stones题解
题目描述
N 个正整数组成的集合 A={a1,a2,…,aN}。太郎君和次郎君将用以下游戏进行对决。
首先,准备一个有 K 个石子的堆。两人依次进行以下操作。太郎君先手。
- 从集合 A 中选择一个元素 x,从石堆中恰好移除 x 个石子。
不能进行操作的人输掉游戏。当两人都按照最优策略行动时,判断谁会获胜。
输入格式
输入以以下格式从标准输入中提供:
N K
a1 a2 … aN
输出格式
如果先手太郎君获胜,输出 First;如果后手次郎君获胜,输出 Second。
显示翻译
题意翻译
输入输出样例
输入 #1复制
2 4 2 3
输出 #1复制
First
输入 #2复制
2 5 2 3
输出 #2复制
Second
输入 #3复制
2 7 2 3
输出 #3复制
First
输入 #4复制
3 20 1 2 3
输出 #4复制
Second
输入 #5复制
3 21 1 2 3
输出 #5复制
First
输入 #6复制
1 100000 1
输出 #6复制
Second
说明/提示
样例解释 1
先手取走 3 个石子,后手无法进行操作。因此,先手获胜。
样例解释 2
无论先手如何操作,后手总能获胜:
- 如果先手取走 2 个石子,后手取走 3 个石子,先手将无法进行操作。
- 如果先手取走 3 个石子,后手取走 2 个石子,先手将无法进行操作。
样例解释 3
先手可以取走 2 个石子。之后,无论后手如何操作,先手都能获胜:
- 如果后手取走 2 个石子,先手取走 3 个石子,后手将无法进行操作。
- 如果后手取走 3 个石子,先手取走 2 个石子,后手将无法进行操作。
数据范围
- 所有输入均为整数。
- 1≤N≤100
- 1≤K≤105
- 1≤a1<a2<⋯<aN≤K
Translated by User 735713.
思路
DP+博弈论。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[105],f[100005];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(a[j]<=i){
if(f[i-a[j]]==0){
f[i]=1;
}
}
}
}
if(f[k]==1){
cout<<"First"<<endl;
}
else{
cout<<"Second"<<endl;
}
return 0;
}

浙公网安备 33010602011771号