传送门

Wc在苦学一学期的魔法之后终于有所成就,并成功获得了奖学金。

现在有一条长廊,上面有n个房间,从1开始编号,wc要去第k个房间拿奖学金。刚开始在第一个房间和第n个房间处分别有一个传送门,WC可以利用传送门进行传送。

传送门的传送有如下规则:

1)传送门只能传送到两个魔法阵中间的位置
如:传送门在1、1位置,那么只能传送到1

传送门在1、2位置,那么只能传送到1

传送门在1、3位置,那么只能传送到2

传送门在1、4位置,那么只能传送到2(简单的除法)

2)在传送完成后,如果到达第k个房间,则传送结束;如果未到目的地,就只能在面向第k个房间的方向的前一个房间的位置设置一个新的传送门,并且移除背对自己的传送门,确保传送门只有两个

如:有5个房间,要去第4个房间 传送门的位置在1、5

第一次传送 到达第3个房间,4在3的右边,所以在第4个房间设置传送门,移除第1个房间的传送门,现在传送门的位置在4、5

第二次传送 到达第4个房间

如果在传送到第1个房间,只能在第2个房间设置传送门

如果在传送到第n个房间,只能在第n-1个房间设置传送门

 

现在问你wc至少要传送几次才能到达第k个房间。

 

Input

输入数据有多组 
每行两个整数n、k (1<=k<=n<=1000000) 

Output

每行一个整数,表示最少的传送次数

Sample Input

2 2
9 5
5 4
50 3
1000000 1000000

Sample Output

2
1
2
4
20

Hint

#include<iostream>
using namespace std;
int a[1000015];
int main()
{
	int n,k;
	while(cin>>n>>k)
	{   int x;
	int count=0;
	int i=1;
for(int j=1;j<=n;j++)
a[j]=j;
	
		while(i<=n)
		{
			x=(a[i]+a[n])/2;
			
			count++;
			if(x==k)
			{
				cout<<count<<endl;
				break;
			}
			else if(x<k)
			{
				i=x+1;
			}
			else
			n=x-1;
		
			
		}
		
	}
	
	
	return 0;
}

这个有点多余,下面这个比较好

#include<iostream>
#include<algorithm>
using namespace std;

int n,k;
int ans;

int binary_search(int l,int r,int k){
	int sum=0;
	while(l<=r){
		sum++;
		int mid=(l+r)/2;
		if(mid==k) return sum;
		if(mid<k) l=mid+1;
		if(mid>k) r=mid-1;
	}
}

int main(){
	while(cin>>n>>k){
		ans=binary_search(1,n,k);
		cout<<ans<<endl;
	}
}


//模拟二分搜索  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值