阿里巴巴2017暑期实习生-算法工程师(机器学习)编程测验题
题目:
有n个石子(n<=100),A、B双方轮流选取,每次取走若干个石子,取走最后一个石子的一方获胜。要求:第一次不能全部取完;各方每次选取的石子数不能为0,也不能超过上次对方选择的石子数。问:如果A先取,那么第一次应该选几个才能保证获胜?如果第一次有多种策略,则输出石子数最多的一种。
析:题目中有一个规律,当剩余石子数目为2的m次方时(2, 4, 8, 16),下一次拿的一定会输。因此只要A拿了之后剩余2的m次方之后,就能保证A会赢。
while True: try: n = int(raw_input()) tag = 1 if n <= 1: print "error" while True and n != 1: tag *= 2 if tag == n: print "winer is B" break elif tag > n: tag = tag/2 print n - tag break except: break
另附上C的实现
#include <stdio.h> #include <stdlib.h> int main() { int n; while(scanf("%d", &n) != EOF){ if(n <= 1){ printf("Input Error.\n"); continue; } int tag = 1; while(1){ tag *= 2; if(tag == n){ printf("The winner is B.\n"); break; } else if(tag > n){ tag = tag/2; printf("The winner is A, A takes %d stones.\n", n-tag); break; } } } return 0; }

浙公网安备 33010602011771号