外包做网站一般多少钱,北京朝阳区二手房出售,用nodejs可以做网站么,wordpress cms列表一、链接
比赛
二、题目
题目描述
有n个人要进行比赛#xff0c;比赛规则如下#xff1a;
假设每轮比赛的人是m#xff0c;取最大的k#xff0c;k2^t且k≤m。这k个人每2人举行一场比赛#xff0c;胜利者进入一下轮#xff0c;失败者被淘汰。余下的m-k个人#xff0…一、链接
比赛
二、题目
题目描述
有n个人要进行比赛比赛规则如下
假设每轮比赛的人是m取最大的kk2^t且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
三、题意
有n个人进行比赛最后只剩下一个人输出比赛轮数和比赛场数需要找到最大的小于总人数n的2的指数函数的值k
四、代码
c
#includeiostreamusing namespace std;int main()
{int t;//表示样例数scanf(%d,t);while(t--){int n,k1,a0,b0;//n表示总人数k表示最接近n的2的指数函数的值//a表示轮数b表示场数scanf(%d,n);if(n2) printf(0 0\n);//只剩下一个人就不需要比较特判else{while(n1)//只要不是剩下一个人就一直循环{while(kn) k*2;//寻找最接近n的2的指数函数的值if(k!n) k/2;//跳出上面循环会多乘一次所以除掉一个2//当然kn不算多乘了一次条件判断if(kn)也是可以的a;//每一次算一轮bk/2;//比赛进行k/2场n-k/2;//淘汰k/2个人}printf(%d %d\n,a,b);}}return 0;
}
c语言
#includestdio.hint main()
{int t;scanf(%d,t);while(t--){int n,k1,a0,b0;scanf(%d,n);if(n2) printf(0 0\n);else{while(n1){while(kn) k*2;if(kn) k/2;a;bk/2;n-k/2;}printf(%d %d\n,a,b);}}return 0;
} 五、总结
1.怎么找到最大的小于总人数n的2的指数函数数值k:使用一个循环让k从1开始循环每一次循环把k乘以2一直到k大于n的时候跳出循环
while(kn) k*2;
这个时候需要注意一个特判如果两个数字相等怎么办如果总人数n是偶数好吧其实是因为我审题的时候没有仔细题目说了是km意思也就是说等于也是可以的当然我们模拟发现也是可以的......(多此一举了)
#includeiostreamusing namespace std;int main()
{int t;//表示样例数scanf(%d,t);while(t--){int n,k1,a0,b0;//n表示总人数k表示最接近n的2的指数函数的值//a表示轮数b表示场数scanf(%d,n);if(n2) printf(0 0\n);//只剩下一个人就不需要比较特判else{while(n1)//只要不是剩下一个人就一直循环{while(kn) k*2;//寻找最接近n的2的指数函数的值k/2;//跳出上面循环会多乘一次所以除掉一个2//当然kn不算多乘了一次条件判断if(kn)也是可以的a;//每一次算一轮bk/2;//比赛进行k/2场n-k/2;//淘汰k/2个人}printf(%d %d\n,a,b);}}return 0;
}
改成这样甚至不用再多加一个条件判断可以肯定多乘了一次2所以直接除以一次2即可这个就是跳出循环的临界条件只有kn才会跳出循环但是这个时候k是不满足条件的所以需要回退一次也就是除以2 2.轮数场数总人数之间的关系是什么
每一轮需要算出一个小于等于总人数n的一个最大的2的指数函数数值k
每一轮需要进行k/2场比赛
每一轮需要淘汰k/2个人
不断地更新轮数场数总人数不大于总人数的最大的2的指数函数数值k即可
3.比赛最后只要留下一个冠军也就是说总人数等于1是结束的标识跳出循环的临界条件
六、精美图片