题解 | #石头、剪刀、布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 算法题