有n个人要进行比赛,比赛规则如下:
- 假设每轮比赛的人是m,取最大的k,k=2t且k≤m。这k个人每2人举行一场比赛,胜利者进入一下轮,失败者被淘汰。
- 余下的m-k个人,不进行比赛,直接进入下一轮
- 直到决出冠军,比赛结束。
比如有5个人参加比赛,第一轮举办2场,剩余3人进入第二轮,第二轮1场,剩余2人进入第三轮,第三轮举办1场决出冠军,所以一共要办4场比赛。 请问一共要举行几轮多少场比赛?
输入
第一行是一个整数K,表示样例的个数。 以后每行一个样例,为n(1≤n≤1000000000)
输出
每行输出两个整数,轮数和比赛场数,中间用一个空格隔开。
样例输入
2 1 5
样例输出
0 0 3 4
思路分析,注意一下k的取值范围,是2的n次方,然后就画图分析
#include <iostream>
using namespace::std;
int main()
{
int K;
cin >> K;
while (K--)
{
int n;//n个人打比赛
int k;//每轮k个人打比赛
int count = 0;//用于记录打了多少场比赛
int count2 = 0;//用于记录打了多少轮比赛
cin >> n;
while (n > 1)
{
k = 1;
count2++;
while (k<n)
{
k *= 2;
}
if (k>n)
{
k /= 2;//因为k为2的t次方,我们就先循环使k变大,然后当k>n后将k只除一次2,那么就可以得到
//最接近n的k
}
count += k/2;//储存打了多少场比赛
n -= k / 2;
}
cout << count2 << " " << count << endl;
}
}