题目描述:
一场诸神之战在神仙中爆发了。诸神之战采用的形式是1v1的淘汰赛,胜利的神仙进入下一轮。如果参加某一轮的神仙数量是奇数的话,那么就会有一个幸运的神仙轮空,直接进入下一轮。红太阳神想知道,在运气最好的情况下,他能闯进第几轮?
输入:
多组数据。 第一行给出一个正整数T。T为数据组数。 接下来T行,每行包括两个正整数N和M。N表示参加第一轮的神仙的数量,M表示红太阳神的实力在所有的神中排第几。假设所有的神仙的实力都不相同,排名靠前的神仙一定能战胜排名靠后的神仙。
1 < T <
104
10
4
1 < n , m <
109
10
9
输出:
对于每组数据,在单独的一行中输出一个整数表示红太阳神运气最好的时候能闯进第几轮。
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
int T;
cin>>T;
while(T--)
{
int m,n;
cin>>n>>m;
int y=m-1; /**y是菊苣的个数**/
m=n-m; /**m是比他更加垃圾的人数**/
int level=1; /**初始化**/
/**循环条件:当还有比他垃圾的人(比上不足比下有余)
或者 没有人比他垃圾 并且比他厉害的人刚好两两决斗 (可坐山观虎斗)
并且不能出现:已经只剩下一个人比他弱,并且没人比他更吊(已经进入决赛胜出模式)
**/
while((m||(m==0&&y%2==0))&&!(y==0&&m==1))
{
if(m) /**如果有更菜的,选一个来打**/
m--;
if(y%2&&m>0) /**如果还有更垃圾的,并且还有奇数个菊苣,就要拉一个菜鸡给他玩**/
{
m--;
}
if(m) /**如果还有菜鸡,那么菜鸡自相残杀,同时考虑轮空**/
m=m/2+m%2;
y=y/2+y%2; /**对于菊苣同上**/
level++; /**进入下一level**/
}
cout<<level<<endl;
}
return 0;
}