P1247 取火柴游戏 (奇异局势)

题目链接

题目描述

输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取。

谁取走最后一根火柴为胜利者。

编一个程序,在给出初始状态之后,判断是先取必胜还是先取必败,如果是先取必胜,请输出第一次该如何取。如果是先取必败,则输出“lose”。

输入格式

第一行,一个正整数k

第二行,k个整数n1,n2,…,nk

输出格式

如果是先取必胜,请在第一行输出两个整数a,b,表示第一次从第b堆取出a个。第二行为第一次取火柴后的状态。如果有多种答案,则输出<b,a>字典序最小的答案(即b最小的前提下a最小)。

如果是先取必败,则输出“lose”。

题解:copy from : https://www.luogu.com.cn/blog/user53167/solution-p1247

 1 #include <bits/stdc++.h>
 2 # define LL long long
 3 using namespace std;
 4
 5 int k;
 6 int arr[500010];
 7 int main(){
 8     scanf("%d", &k);
 9     int check=0;
10     for(int i=1;i<=k;++i){
11         scanf("%d", arr+i);
12         check^=arr[i];
13     }
14     if(check==0){
15         printf("lose");
16         return 0;
17     }
18
19     for(int i=1;i<=k;++i){
20         if((check^arr[i])<arr[i]){
21             int move=arr[i]-(check^arr[i]);
22             arr[i]=check^arr[i];
23             printf("%d %d\n",move,i);
24             break;
25         }
26     }
27     for(int i=1;i<=k;++i){
28         printf("%d ", arr[i]);
29     }
30     return 0;
31 }

原文地址:https://www.cnblogs.com/FEIIEF/p/12256503.html

时间: 2024-10-09 09:49:28

P1247 取火柴游戏 (奇异局势)的相关文章

P1247 取火柴游戏

题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2) {从一堆中取一根} P:(1,2)→(1,1) {从另一堆中取一根} A:(1,1)→(1,0) P:(1,0)→ (0,0) {P胜利} 如果

洛谷P1247 取火柴游戏 数学题 博弈论

这题就是NIM取石子游戏,但是NIM取石子方案并不是单一的,而是有多种方案的,现在让我们求字典序最小的方案,其实还是简单的,作为先手,如果是必胜局面,那我们肯定第一步把所有子异或和变为零 ,这样对于对方,这就是一个必败局面了 2.那我们来考虑怎么把局面变成必败局面呢,换句话说,怎么判断这一堆取不取呢, 假设a[ i ]不取他们的异或值为 y ,那么如果我们把a[ i ]变成 y 那么 y^y=0 就必胜了那就只要判断 if a[ i ]>=y 就可知在这一位上改变可不可行了,要字典序最小那就i从

P1247 取火柴游戏(异或理论)

https://www.luogu.com.cn/problem/P1247 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 5e5 + 5; int n; int a[maxn]; signed main(){ //freopen("in","r",stdin); ios::sync_with_stdio(0); cin >&

【贪心】取火柴游戏

[贪心]取火柴游戏 题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2)    {从一堆中取一根} P:(1,2)→(1,1)    {从另一堆中取一根} A:(1,1)→(1,0) P:(1,0)

【博弈论】取火柴游戏

取火柴游戏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2)    {从一堆中取一根} P:(1,2)→(1,1)    {从另一堆中取一根}

poj 1067||hdu 1527 取石子游戏(博弈论,Wythoff Game)

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37893   Accepted: 12684 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

[原博客] POJ 1067 取石子游戏

题目链接有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者.(中文题面,感动ing) 但是这道题实在是呵呵.开始没啥思路,根据必胜状态必败状态的定义,n^3打了个表,看起来是这样的. 图为100x100,已经缩小,左上角是状态(0,0),右下角状态为(10

hdu 1527 取石子游戏(威佐夫博奕模板题)

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3562    Accepted Submission(s): 1789 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的

取石子游戏(hdu1527+威佐夫博弈)

S - 取石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1527 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到