【NYOJ】取石子系列总结(十一题全)

取石子(一)

基础的巴什博奕

巴什博奕的重点是只有一堆

如果n % (m + 1) != 0 则先手赢,如果用普通的数组会TLE。

证明:如果n = m + 1,先手最多拿m个,肯定有剩下的,所以先手必输,所以碰到k(m + 1)的局面的人必输。

那么如果n = k(m + 1) + s,这个k 就是系数,s < m + 1,那么只要先手拿掉s个,这样后手面对的就是k(m + 1)局面,所以先手在

n % (m + 1) != 0时必输。

#include <iostream>
using namespace std;
int a[1000001];
int main(){
	int t,n,m;
	cin>>t;
	while(t--){
		cin>>n>>m;
		if(n % (m + 1) != 0){
			cout<<"Win"<<endl;
		}else{
			cout<<"Lose"<<endl;
		}
	}
	return 0;
}

取石子(二)

这题是尼姆博弈巴什博奕的结合

每一堆是巴什博奕,如果巴什博奕赢了就看成是石子数为1的堆,如果输了就看成是石子数为0的堆(看做没有了),下面面对的就是尼姆博弈,如果1的堆数是2的倍数,就相当于尼姆博弈中的奇异局势,面对这种局势必输,如果石子数为1的堆数不是2的倍数,那么是非奇异局势,必赢。

#include <iostream>
using namespace std;
int main(){
	int N,a,b;
	int T;
	cin>>T;
	while(T--){
		cin>>N;
		int ans = 0; 
		for(int i = 0; i < N; i++){
			cin>>a>>b;
			ans ^= (a % (b + 1));
		}
		if(ans) cout<<"Win"<<endl;
		else cout<<"Lose"<<endl;
	}
	return 0;
}

取石子(三)

 真是看了半天,好多帖子都没讲清楚的感觉,男人八题之一,看上去就非常吓人,但是代码真的很简洁,有点像尼姆博弈。

但是不一样,我们可以分析,

假如有一堆石子,先手必赢(N局势),

假如有两堆石子,如果两堆的数量一样,先手必输(P局势),如果两堆数量不一样,N局势,

假如有三堆石子,先手必赢(N局势)

假如有四堆石子,如果石子数量量相同,P,如果不相同,N。

以此类推

如果有n堆石子,n为奇数,先手必赢,如果n为偶数,且石子数两两相同,先手必输,否则就赢。

我自己想肯定想不出来的感觉……

#include<iostream>
#include<cstring> 
using namespace std;
int a[105];
int main(){
	int n;
	while(cin>>n && n){
		int flag = 0;
		memset(a,0,sizeof(a));
		for(int i = 0; i < n; i++){
			int t;
			cin>>t;
			a[t]++;
		}
		if(n & 1)//如果是奇数,赢定了 
			cout<<"Win"<<endl;
		else{
			for(int i = 0; i <= 100; i++){
				if(a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值