题目来源
题目概述
Alice 和 Bob 轮流玩一个游戏,Alice 先手。
一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。
给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。
所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。
请你推断游戏的结果,用如下的方式表示:
如果 Alice 赢,返回 1 。 如果 Bob 赢,返回 -1 。 如果游戏平局,返回 0 。
思路分析
每次取石子的时候,不但会让自己得分,也会让对方无法获得这个石头的分数,也就是让自己相比于对方多获得了aliceValues[i] + bobValues[i]的分数。
代码实现
java实现
public class Solution {
public int stoneGameVI(int[] aliceValues, int[] bobValues) {
int[][] sum = new int[aliceValues.length][3];
for (int i = 0; i < aliceValues.length; i++) {
sum[i][0] = aliceValues[i] + bobValues[i];
sum[i][1] = aliceValues[i];
sum[i][2] = bobValues[i];
}
Arrays.sort(sum, (a,b) -> b[0] - a[0]);
int aliceScore = 0;
int bobScore = 0;
for (int i = 0; i < aliceValues.length; i++) {
if ((i & 1) == 1) {
bobScore += sum[i][2];
}else {
aliceScore += sum[i][1];
}
}
int temp = aliceScore - bobScore;
if (temp == 0) {
return temp;
}else {
return temp > 0 ? 1 : -1;
}
}
}
c++实现
class Solution {
public:
int stoneGameVI(vector<int>& aliceValues, vector<int>& bobValues) {
vector<vector<int>> sum = vector<vector<int>>(aliceValues.size());
for (int i = 0; i < aliceValues.size(); i++) {
sum[i].push_back(aliceValues[i] + bobValues[i]);
sum[i].push_back(aliceValues[i]);
sum[i].push_back(bobValues[i]);
}
sort(sum.begin(), sum.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] > b[0];
});
int aliceScore = 0;
int bobScore = 0;
for (int i = 0; i < aliceValues.size(); i++) {
if ((i & 1) == 1) {
bobScore += sum[i][2];
}
else {
aliceScore += sum[i][1];
}
}
int temp = aliceScore - bobScore;
if (temp == 0) {
return temp;
}
else {
return temp > 0 ? 1 : -1;
}
}
};