卡牌对弈游戏策略
问题描述
小C最近在玩一种卡牌对弈游戏,双方各持有相同数量的卡牌,每张卡牌都有一个特定的武力值。双方每轮各出一张卡牌,若己方卡牌的武力值大于对方,则该轮取胜。小C具备读心术,能够预知对方的出牌顺序,但需要你帮他设计一个最优策略,来尽可能赢得最多的对弈局数。
每轮对弈中双方各出一张卡牌,游戏结束时需要使用完所有卡牌。你需要输出小C最多能赢得的对弈局数。
例如,当双方手中卡牌的武力值分别为[1, 2, 3]和[1, 2, 3]时,小C可以最多赢得2局。
测试样例 样例1:
输入:n = 3, x = [1, 2, 3], y = [1, 2, 3]
输出:2
样例2:
输入:n = 3, x = [1, 3, 2], y = [5, 5, 5]
输出:3
样例3:
输入:n = 4, x = [2, 4, 6, 8], y = [3, 3, 7, 9]
输出:3
思路
小c会读心术,那么我们完全可以田忌赛马;
考虑如何赢得对方最优,那么我们只需选择在我们手牌中第一个比对方当前出牌大的牌即可,因为小c可以预测对方的顺序,那么博弈的顺序并不重要
考虑队对两人的手排序,维护两人手牌数组的指针,假设两人都按从大到小的顺序出牌,如果y[i]< x[j]; 我们让小c牺牲武力值最小的牌,保留当前牌与后面对手更弱的牌进行对战;
进行贪心的选择即可;
code
def solution(n: int, x: list, y: list) -> int:
x.sort(reverse=True)
y.sort(reverse=True)
xi=0
yi=0
ans =0
for i in range(n):
if x[xi]<y[yi]:
ans+=1
xi+=1
yi+=1
else:
xi+=1
return ans
if __name__ == '__main__':
print(solution(n=3, x=[1, 2, 3], y=[1, 2, 3]) == 2)
print(solution(n=3, x=[1, 3, 2], y=[5, 5, 5]) == 3)
print(solution(n=4, x=[2, 4, 6, 8], y=[3, 3, 7, 9]) == 3)