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;
}

posted @ 2025-10-22 21:07  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源