预测输赢(阿里巴巴2018年秋招提前批内推编程题)

题目:2016年,AlphaGo大战人类围棋职业选手,并获得了最终的胜利,引起了人们的广泛关注和思考。AlphaGo每次落子之前,通过计算,预测每一个位置落子后,最终取胜的概率。今天,我们也来玩一个游戏,来扮演一下AlphaGo的角色。现在,桌子上有一堆牌,且整齐地平放在桌面上,我们用1~13的数字表示牌面的大小。现在,有两个选手,每次轮流从这些牌的一端取一张牌,直到取完为止。最后取到的所有牌的牌面大的为胜。现在,给出一堆牌,让AlphaGo来预测输赢。

输入描述
输入数据包含两行,第一行有一个数字n,表示有n张牌,第二行有n个数字,每个数字的大小是牌面的大小。

输出描述
输出0,1,2,分别表示平局,第一个选手胜利,第二个选手胜利。

例如
输入:
3
3 4 5
输出:
1

示例代码如下:

#include < iostream >
#include < deque>
using namespace std;

int main()
{
    int m_count;//牌的数量

    cin >> m_count;

    deque< int >  deq;//双端队列

    int i = 0;
    while (i < m_count)
    {//输入牌的排序和编号
        int data;
        cin >> data;
        deq.push_back(data);
        i++;
    }

    //计算得分
    int ScoreA = 0;
    int ScoreB = 0;
    bool TurnA = true;//A先选择

    while (deq.size()!=0)
    {
        int size = deq.size();
        int first = deq.at(0);
        int last = deq.at(size - 1);

        if (TurnA)
        {
            if (first > last)
            {
                ScoreA += first;
                deq.pop_front();
            }
            else
            {
                ScoreA += last;
                deq.pop_back();
            }
            TurnA = false;
        }
        else
        {
            if (first > last)
            {
                ScoreB += first;
                deq.pop_front();
            }
            else
            {
                ScoreB += last;
                deq.pop_back();
            }
            TurnA = true;
        }
    }
    //胜负比较
    if (ScoreA > ScoreB)
    {
        cout << int(1) << endl;//A胜利
    }
    else if (ScoreA < ScoreB)
    {
        cout << int(2) << endl;//B胜利
    }
    else
    {
        cout << int(0) << endl;//平局
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Lunar_Queen/article/details/81635437