当前位置:网站首页>1686. 石子游戏 VI
1686. 石子游戏 VI
2022-08-02 23:56:00 【Mr Gao】
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;
}
边栏推荐
- C# 异步编程(async和await)
- Let's talk about the charm of code language
- 典型相关分析CCA计算过程
- 电压传感器: 工作原理、类型及电路图
- 21天学习挑战赛(1)设备树的由来
- CKAN教程之将 Snowflake 连接到 CKAN 以发布到开放数据门户
- 十年架构五年生活-03作为技术组长的困扰
- 如何修复 SAP UI5 aggregation with cardinality 0..1 相关的错误消息
- matplotlib中的3D绘图警告解决:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure
- ORA-55610: Invalid DDL statement on history-tracked table
猜你喜欢
随机推荐
华为设备配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down)
我们来浅谈代码语言的魅力
基于STM32设计的老人防摔倒报警设备(OneNet)
FreeRTOS任务管理
CKAN教程之将 Snowflake 连接到 CKAN 以发布到开放数据门户
Auto.js special positioning control method cannot perform blocking operations on the ui thread, please use setTimeout instead
厌倦了安装数据库?改用 Docker
random.nextint()详解
flutter 时间戳转日期
LVM与磁盘配额原理及配置
可编程逻辑控制器(PLC) : 基础、类型和应用
十三、数据回显
牛客网剑指offer刷题练习之链表中环的入口结点
HVV红队 | 渗透测试思路整理
fifa将采用半自动越位技术计算进球
js基础知识整理之 —— 获取元素和命名规范
Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
matplotlib中的3D绘图警告解决:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure
智能合约安全-可重入攻击(SW107-Reentrancy)
Last Common Ancestor (LCA) Study Notes | P3379 【Template】Least Common Ancestor (LCA) Problem Solution