某大公司的一道面试逻辑题

去面某大公司被问了一道题,现在有N(N是偶数且要符合某个规则)个球,然后有2个人A和B,他们每次能摸的球的数目呢是2 , 4, 8个,现在问如果A先摸球,如何让A100%获胜.
当时时间太紧,并且紧张没能想出来,今天重新整理思路把这题给做了出来
这道题呢要把球分解一下,分解成p个4球 和 q个2球的组合,由于N是偶数所以必定能分解,且分解后q最多为1(优先分配4球)
为何要这样分解呢,我们可以考虑一下如何才能获胜,要获胜那么也就是必定要让你摸完倒数第二次之后,对方不可能一次摸完余下的球
对方在什么情况不可能摸完余下所有的球呢?
当A摸完之后,可能有如下情况
1:剩余6个球 = p+q(此时B只能摸2个,不允许一次摸6个这种情况存在,所以A摸4个就可以获胜)
2:剩余10个球 = 2p + q(此时B若摸2或者8个,则A摸8个或者4个获得胜利;若B摸4个,剩余剩余6个,则A输)
3:剩余12个球 = 3p(B摸2个,则跳到情况2,这里要注意,跳到2之后就变成A摸球了,所以A可以摸4个让B输,则B输;摸4和8个仍就是B输;)

发现只要A摸完后剩余的球带有p+q组合的即6的组合的,B就无法获胜,现在我的目的就简单了,我只需要每次总是让摸完后剩余的球是6的倍数就可以了
到这里我们知道了 球的总数不能为6的倍数,否则A就没有办法100%获胜

void Pickball_game(int sum)
{
	using namespace std;
	if(sum < 2 || sum %2 != 0 || sum %6 == 0){
		cout << "球的个数不符合规则" << endl;
		return;
	}
	srand(int(time(0)));
	int b[] = {2,4,8};//每次取球的个数
	//A第一个摸球,第一个摸球就能掌控全局
	cout << "当前一共有" << sum <<"个球,游戏开始" << endl;
	while(sum){
			int pick =sum -  sum/6*6 ;
			sum -= pick;
			cout << "A摸了"<< pick << "个球";
			if(sum == 0){
				cout << ",A获得了胜利" << endl;
				return;
			}
			int t = rand()%3;
			while(sum < b[t]) t = rand()%3;
			sum -= b[t];
			cout << ",B摸了"<< b[t] << "个球";
			cout << ",还剩" << sum << "个球" << endl;
	}
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值