Alice 和 Bob 轮流玩一个游戏,Alice 先手。
一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。
给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。
所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。
请你推断游戏的结果,用如下的方式表示:
如果 Alice 赢,返回 1 。
如果 Bob 赢,返回 -1 。
如果游戏平局,返回 0 。
class Solution {
public int stoneGameVI(int[] aliceValues, int[] bobValues) {
int[][] dp = new int[aliceValues.length][2];
for(int i = 0;i<aliceValues.length;i++) {
dp[i][0] = aliceValues[i]+bobValues[i];
dp[i][1] = i;
}
//重写Conparator方法,实现倒序
Comparator comparator=new Comparator(){
@Override
public int compare(Object o1,Object o2) {
int[] arr1=(int [])o1;
int[] arr2=(int [])o2;
if(arr1[0]==arr2[0]) return 0;
return arr1[0]>arr2[0]?-1:1;
}
};
Arrays.sort(dp,comparator);
int n = 0,suma=0,sumb=0;
while(n<aliceValues.length) {
if(n%2 == 0) {
suma += aliceValues[dp[n][1]];
}else {
sumb += bobValues[dp[n][1]];
}
n++;
}
if(suma==sumb) return 0;
return suma>sumb?1:-1;
}
}
输入:aliceValues = [2,4,3], bobValues = [1,6,7]
输出:-1
解释:
不管 Alice 怎么操作,Bob 都可以得到比 Alice 更高的得分。
比方说,Alice 拿石子 1 ,Bob 拿石子 2 , Alice 拿石子 0 ,Alice 会得到 6 分而 Bob 得分为 7 分。
Bob 会获胜。
用例子来解释,当你拿到4时,b损失了6,记做-6,然后b拿7,你损失3,加起来记为1。所以不如从最开始就记为 你拿到4,b损失6,记为你拿到10,b为0;
所以不如两个数组各项加载一起,然后进行倒序排列,然后你从最大的开始取,最后判断大小。