今天,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] << "\t";
cout << re[1] << endl;
}
運行結果
112 38
請按任意鍵繼續. . .