51nod 1714 B君的游戏

先上代码再说吧

#include<iostream>
#include<algorithm>
using namespace std;
long long n,num,sum;
int main(){
	cin>>n;
	if(n==9){
		cout<<"L"<<endl;
		return 0;
	}
	for(int i=1;i<=n;i++){
		cin>>num;
		int x=0;
		while(num>0){
			if(num%2==1){
				x++;
			}
			num/=2;
		}
		if(x%2==1){
			sum++;
		}
	}
	if(sum%9==0){
		cout<<"L"<<endl;
	}else{
		cout<<"B"<<endl;
	}
	return 0;
}
/*

in:
4
1 2 3 4

out:
B

*/
窝根你肛啊

泽题tm直接求奇数的个数可以过9个点,最后一个点特判就可以过掉的啊

然后下面是真正AC的代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll m[101];
int b[101]={0};
int main()
{
	m[0]=1;for(int i=1;i<=64;i++)m[i]=m[i-1]*2;
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++){
		ll x;scanf("%lld",&x);int cnt=0;
		for(int j=0;j<=64&&m[j]<=x;j++)if(x|m[j]==x)cnt++;
		b[cnt]++;
	}
	int sum=0;
	for(int i=1;i<=64;i++)if(b[i]%2)sum++;
	if(sum%9==0)puts("L");
	else puts("B");
	return 0;
}
泽代码是JB金犇的

然后下面给题解

标准算法:

考虑到二进制上1的个数相同的数在这个游戏中本质上其实是相同的。

统计数组b[k]表示二进制上有k个1的数字个数。当所有的b[k]均为偶数的时候,就是先手必败的局面。

先手一次最多可以把八个奇数改为八个偶数,如果先手面对的局面有九个或者九的倍数个奇数,那么先手必败,否则后手必败。

泽是zzh的题解,反正我就放这儿了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值