GZHU - 1514 口袋飞龙(简单模拟)

一年一度的海拉鲁口袋飞龙锦标赛开始了!
你身为鼓隆村最强的驯龙师,带着你的伙伴【熔岩飞龙X】也参加了这场比赛。
在参加之前,你想知道你的飞龙能够赢的场数的最大值和最小值。
在那之前,你知道这场比赛一共有2^k个来自不同地区的驯龙师参赛,并且你知道所有驯龙师的飞龙的实力。
为了简化问题,在这里假设第i个驯龙师的飞龙的能力值为i,当两只飞龙对战时,能力值高的必定胜利。并且假设你是第p个驯龙师。
锦标赛的赛制为,每轮将所有的驯龙师两两随机配对,配对的驯龙师进行对战,败者被淘汰,胜者进入下一轮,然后重复上面说的过程直至只剩一个人。
也就是说,每轮之后总人数都会除以2。
好了,身为鼓隆村最强的驯龙师、占星术士、理论计算机科学家的你,解决这个问题对你来说应该不难吧?

Input
第一行为一个整数t,表示数据组数。
接下来的t行,每行有两个整数k,p。
t<=10000,k<=30,1<=p<=2^k
Output
对于每组数据,输出最大值和最小值,用一个空格隔开,占一行。
Sample Input
1
1 1
Sample Output
0 0
Hint
2^k即为2的k次幂。
问题链接: -
问题简述: 中文题意
问题分析: 写出几组数据找一下规律不难发现,每次战斗比你弱的人包括你在内都会减少一半+1,所以计算包括自己在内的数能减少多少个一半即可求出最大值,最小值只要不是最强的都是0,是最强的情况跟最大值一致
AC通过的C++语言程序如下:

#include <iostream>
#include <algorithm>
#include <iostream>
#include <string>
#include <stdio.h>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <math.h>
#include <climits>
#include <iomanip>
#include <queue>
#include<vector>
using namespace std;
  
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int k,p;
        cin>>k>>p;
        int ans1=0,ans2=0;
        int g=p;
        while(p!=0)
        {
            if(p==1)
            {
                break;
            }
            p/=2;
            ans1++;
        }
        if(g!=pow(2,k))
            ans2=0;
        else
            ans2=ans1;
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值