题目
1688.比赛中的配对次数
题目大意
给你一个整数 n
,表示比赛中的队伍数。比赛遵循一种独特的赛制:
- 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行
n / 2
场比赛,且产生n / 2
支队伍进入下一轮。 - 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行
(n - 1) / 2
场比赛,且产生(n - 1) / 2 + 1
支队伍进入下一轮。
返回在比赛中进行的配对次数,直到决出获胜队伍为止。
样例
数据规模
思路
一开始读题目,以为这需要一个数学公式来加速完成,但是看到了 1 < = n < = 200 1<=n<=200 1<=n<=200,那就直接模拟过程就好了。
一直循环,直到 n = 1 n=1 n=1停止。如果 n n n是奇数,那么贡献就是 ( n − 1 ) / 2 (n-1)/2 (n−1)/2;如果n是偶数,那么贡献就是 n / 2 n/2 n/2,然后更新n的值。最后返回贡献sum即可。
代码
class Solution {
public:
int numberOfMatches(int n) {
int sum=0;
while(n!=1){
if(n&1)sum+=(n-1)/2,n=(n-1)/2+1;
else sum+=n/2,n=n/2;
}
return sum;
}
};
思路2
其实我看到样例我就在猜测答案会不会就是
n
−
1
n-1
n−1,于是在用上面的代码AC之后,我直接提交了return n-1
,果然它AC了。其实可以很感性的理解:有
n
n
n支队伍,其中
n
−
1
n-1
n−1支队伍无法晋级,就需要
n
−
1
n-1
n−1场比赛淘汰它们。
代码2
class Solution {
public:
int numberOfMatches(int n) {
return n-1;
}
};