阿里巴巴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;
}

 

posted @ 2017-04-22 15:23  kuqs(奇小东)  阅读(915)  评论(0)    收藏  举报