金陵飞雄奉献给大家的代码(答案是对的,只是只给出一个解,没考虑多解的情况),谢谢金陵飞雄!

样例输入:(对应小兵的样例)
3 2
1 2
样例输出:
First Player loses
*/
ifstream fin("Test.in");
ofstream fout("Test.out");
int n,pacn; // n:石子总数 pacn:可拿石子的方案数
int *access,*method; // access:可拿石子的方案(数组) method:存放必胜方案
bool *win; // win:记录当先手面对总数为X的石子堆的时候 是 否 有必胜策略
void init(){
fin >> n >> pacn;
access=new int[pacn];
for(int i=0;i<pacn;i++){
fin >> access[i];
if(access[i]>n){ // 如果可拿的比总数还大,break掉
pacn=i;
break;
}
}
}
void process(){
win=new bool[n+1];
method=new int[n+1];
memset(win,0,sizeof(bool)*(n+1));
for(int i=0;i<pacn;i++){
win[access[i]]=true; // 当前面对的正好是某方案数,那就掩面吧- -
method[access[i]]=access[i];
}
for(int i=access[0];i<=n;i++){
for(int j=0;j<pacn;j++){
if(i>access[j])
if(!win[i-access[j]]){ // 如果取后对方面对的是必负情况
win[i]=true; // 当前情况必胜
method[i]=access[j];
}
}
/*fout << i << ' ' << win[i] << endl;
if(win[i])
fout << method[i] << endl;*/ // Debug输出 格式:石子总数 是否先手必胜 方案
}
if(win[n]){
fout << "First Player wins" << endl;
fout << method[n] << endl;
}
else
fout << "First Player loses" << endl;
delete access;
delete win;
delete method;
}
int main(){
init();
process();
return 0;
}
/*