卡牌对弈游戏策略-题解.py

75 阅读2分钟

卡牌对弈游戏策略

问题描述

小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)