力扣算法——石子游戏VI

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;
所以不如两个数组各项加载一起,然后进行倒序排列,然后你从最大的开始取,最后判断大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值