有 n
个不同价值的硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 第一个玩家 是输还是赢?
样例
给定数组 A = [1,2,2]
, 返回 true
.
给定数组 A = [1,2,4]
, 返回 false
.
class Solution {
public:
/**
* @param values: a vector of integers
* @return: a boolean which equals to true if the first player will win
*/
bool firstWillWin(vector<int> &values) {
// write your code here
int n = values.size();
if (n < 3)
{
return true;
}
int buf[n+1];
buf[n] = 0;
buf[n-1] = values[n-1];
buf[n-2] = values[n-2] + values[n-1];
buf[n-3] = values[n-3] + values[n-2];
int sum = values[n-3] + values[n-2] + values[n-1];
for (int i = n-4; i >= 0; i--)
{
int a = values[i] + min(buf[i+2], buf[i+3]);
int b = values[i] + values[i+1] + min(buf[i+3], buf[i+4]);
buf[i] = max(a, b);
sum += values[i];
}
return buf[0] > sum-buf[0];
}
};