1686. 石子游戏 VI

1686. 石子游戏 VI

Alice 和 Bob 轮流玩一个游戏,Alice 先手。

一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。

给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。

所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。

请你推断游戏的结果,用如下的方式表示:

如果 Alice 赢,返回 1 。
如果 Bob 赢,返回 -1 。
如果游戏平局,返回 0 。

示例 1:

输入:aliceValues = [1,3], bobValues = [2,1]
输出:1
解释:
如果 Alice 拿石子 1 (下标从 0开始),那么 Alice 可以得到 3 分。
Bob 只能选择石子 0 ,得到 2 分。
Alice 获胜。

示例 2:

输入:aliceValues = [1,2], bobValues = [3,1]
输出:0
解释:
Alice 拿石子 0 , Bob 拿石子 1 ,他们得分都为 1 分。
打平。

示例 3:

输入:aliceValues = [2,4,3], bobValues = [1,6,7]
输出:-1
解释:
不管 Alice 怎么操作,Bob 都可以得到比 Alice 更高的得分。
比方说,Alice 拿石子 1 ,Bob 拿石子 2 , Alice 拿石子 0 ,Alice 会得到 6 分而 Bob 得分为 7 分。
Bob 会获胜。

解代码如下所示:


void quick_sort(int *a,int low,int high,int *b,int *c){
    if(low<high){
        int l=low,h=high;
        int p=a[low],pb=b[low],pc=c[low];

        while(low<high){
            while(low<high&&a[high]<=p){
                high--;

            }
            a[low]=a[high];
            b[low]=b[high];
            c[low]=c[high];

            while(low<high&&a[low]>=p){
                low++;
            }
            a[high]=a[low];
            b[high]=b[low];
            c[high]=c[low];
        }
        a[low]=p;
        b[low]=pb;
        c[low]=pc;
        quick_sort(a,l,low-1,b,c);
        quick_sort(a,low+1,h,b,c);

    }
}

int stoneGameVI(int* aliceValues, int aliceValuesSize, int* bobValues, int bobValuesSize){
    int *rank=(int *)malloc(sizeof(int)*aliceValuesSize);
    for(int i=0;i<aliceValuesSize;i++){
        rank[i]=aliceValues[i]+bobValues[i];
        
    }
    quick_sort(rank,0,aliceValuesSize-1, aliceValues,bobValues);
    int asum=0,bsum=0;
 
     for(int i=0;i<aliceValuesSize;i++){

         if(i%2==0){
          
             int max=aliceValues[i];
             int j=i+1;
            int index=i;
             if(j==aliceValuesSize){
                  asum=asum+aliceValues[i];;
                  break;


             }
             while(rank[j]==rank[i]&&j!=aliceValuesSize){
            
                 if(aliceValues[j]>max){
                     max=aliceValues[j];
                     index=j;

                 }
                 j++;
                   if(j==aliceValuesSize){break;}
             }

             int t=aliceValues[index];
             aliceValues[index]=aliceValues[i];
             aliceValues[i]=t;
             t=bobValues[index];
            bobValues[index]=bobValues[i];
             bobValues[i]=t;





             asum=asum+aliceValues[i];
         }
         else{


              int max=bobValues[i];
             int j=i+1;
           int   index=i;
             if(j==aliceValuesSize){
                  bsum=bsum+bobValues[i];;
                  break;


             }
             while(rank[j]==rank[i]&&j!=aliceValuesSize){
                 if(bobValues[j]>max){
                     max=bobValues[j];
                     index=j;

                 }
                 j++;
                  if(j==aliceValuesSize){break;}
             }
             int t=aliceValues[index];
             aliceValues[index]=aliceValues[i];
             aliceValues[i]=t;
             t=bobValues[index];
            bobValues[index]=bobValues[i];
             bobValues[i]=t;
             bsum=bsum+bobValues[i];

         }

     
    }
    printf("%d %d ",asum,bsum);
    if(asum>bsum){
        return 1;
    }
    if(asum<bsum){
        return -1;
    }
   
    return 0;
  


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值