硬币排成线 II

来源:互联网 发布:windows反潜驱逐战 编辑:程序博客网 时间:2024/05/16 05:56

有 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];    }};


0 0
原创粉丝点击