某大公司的一道面试逻辑题
来源:互联网 发布:javascript设置cookie 编辑:程序博客网 时间:2024/05/16 00:51
去面某大公司被问了一道题,现在有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;}}
- 某大公司的一道面试逻辑题
- 某付数据科技公司的一道面试附加题
- 公司面试逻辑题
- 一道经典面试逻辑题的python解法
- 一道有趣的逻辑题
- 一道有意思的逻辑题
- 一道有趣的逻辑题
- 面试的一道题
- 前端面试篇,一道大题
- 面试的逻辑题
- 面试-----公司和学生之间一道巨大的鸿沟
- 一些著名的大公司面试题目
- 一些著名的大公司面试题目
- intel面试的一道题
- 各大外包公司软件测试工程师高频出现的一道C编程题
- 某著名公司的一道JAVA笔试题
- 某知名IT公司最近的一道笔试编程题
- 一道某高大上互联网公司的笔试题分享
- Ajax中IE浏览器中的缓存问题
- seo 求帮忙
- sencha touch 1.0发布部署文章
- generic语句使用(VHDL编程)
- 思科认证网络工程师CCNA(更新完毕)
- 某大公司的一道面试逻辑题
- 有限状态机设计
- Eclipse操作之“加载javax.servlet包”
- 修改qt程序的图标
- 什么是TCP 三次握手及为什么进行三次握手?
- Servlet ---- 接口
- Jitsi(SIP communicator)创建自定义UI插件
- nginx配置实例
- 合并多条记录的同一字段值SQL语句