题解 | #石头、剪刀、布I#

石头、剪刀、布I

http://www.nowcoder.com/practice/290afe7420704eb89376e74740b06cb3

描述

Alice和Bob打牌,每人都有n张牌
Alice的牌里有p1张石头牌,q1张剪刀牌,m1张布牌。
Bob的牌里有p2张石头牌,q2张剪刀牌,m2张布牌。
Alice知道Bob每次要出什么牌,请你安排策略,使Alice获胜次数最多。
输出获胜次数。

示例1

输入:
3,3,0,0,0,0,3

返回值:
0

说明:
Alice只有石头,Bob只有布,每一场Alice都必败,所以Alice只能赢0局  

示例2

输入:
6,2,2,2,2,2,2

返回值:
6

说明:
Alice可以在Bob出石头的时候出布,在Bob出布的时候出剪刀,在Bob出剪刀的时候出石头,按照这个策略Alice最多能赢下所有的比赛,所以最多能赢6局

思路

这道题很简单,石头剪刀布,只有石头能克剪刀,只有布能克石头,只有剪刀能克布。
咱们只要判断一下 Alice 有多少布,Bob 有多少石头,然后取最小值,就能得到 Alice 利用 能战胜 Bob 石头 多少次了。其余两队也是如此。

AC 代码

public int Mostvictories (int n, int p1, int q1, int m1, int p2, int q2, int m2) {
        // write code here
        if (n < 1) {
            return 0;
        }
        int count = 0;
        // 当 Alice 的 布牌 和 Bob 的石头牌 都大于 0 时
        // Alice 的获胜次数为 布牌 和 石头牌 最小数量
        // 因为只有布牌克石头牌,石头牌也只有布牌才能战胜
        if (m1 > 0 && p2 >= 0) {
            count += Math.min(m1, p2);
        }
        // 同上
        if (p1 > 0 && q2 > 0) {
            count += Math.min(p1, q2);
        }
        // 同上
        if (m2 > 0 && q1 > 0) {
            count += Math.min(m2, q1);
        }
        return count;
    }
  • 时间复杂度:O(1),没有进行数组迭代之类的操作
  • 空间复杂度:O(1),没有使用额外空间

最后

大家有兴趣可以来我的牛客博客中看看其他内容,兴许对你有所帮助。

AC_算法题 文章被收录于专栏

AC 算法题

全部评论

相关推荐

头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务