牛客笔试题

今天,Alice 和 Bob 两个人发明了一个新的取石子游戏。我们将 n 枚石子摆放成一行,从左到右每枚石子有两个参数,能量ei 和得分ai 。Alice 和 Bob 两人轮流决策,从左到右依次取石子,Alice 先手。每个回合,玩家可以选择下列两个操作之一:1. 消耗一个单位的能量,跳过这个回合。2. 取当前位置的石子。初始时,Alice 和 Bob分别有A和B单位的能量,两个玩家的目的都是最大化自己的得分,双方都采取最优决策,问游戏结束时,Alice 和 Bob 的得分分别为多少。

题目给定A和B(0≤A≤10^9,0≤B≤10^9)同时给定石子个数n(1≤n≤100), 从左向右,每颗石子的能量e和得分a(所有数字均为正整数,e中元素均小于等于10^9,a中元素的和小于等于100)。请返回一个数组,其中第一个元素为Alice的得分,第二个元素为Bob的得分。

测试样例:
9,0,7,[66,2,6,2,8,4,3],[7,12,65,7,4,40,15]
返回:[112,38]


#include<vector>
class GetT
{
public:
    //目的,最大化自己的得分
    void Get(int &A, int &B, int N, int *e, int *a,int re[])
    {
        //先手
        int *pCurPer = &A;
        int curPer = 1;


        int  cur = 0;
        while (cur<N)
        {
            //有能量且判定下回合的更值钱
            //if (Magic() && NextIsBetter())
            if (*pCurPer && a[cur+1]>a[cur])
            {
                (*pCurPer)--;
                GetNext(pCurPer, curPer, A, B);
                continue;
            }
            else
            {
                //获取能量,获取得分。
                *pCurPer += e[cur];
                re[curPer] += a[cur];

                GetNext(pCurPer, curPer, A, B);
                cur++;
            }
            //取当前位置的石子。
        }
    }
    void GetNext(int *&cur,int &curper,int &p,int &q)
    {
        curper = !curper;
        if (cur == &p)
        {
            cur = &q;
        }
        else
        {
            cur = &p;
        }
    }
};

测试:

void main()
{
    int A = 9;
    int B = 0;
    const int s = 7;
    int see[] = { 66, 2, 6, 2, 8, 4, 3 };
    int sea[] = { 7, 12, 65, 7, 4, 40, 15 };

    int re[] = {0,0};
    GetT get;

    get.Get(A, B, s, see, sea,re);
    cout << re[0] << "	";
    cout << re[1] << endl;
}

运行结果

112 38
请按任意键继续. . .

原文地址:https://www.cnblogs.com/lang5230/p/5138081.html