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;
}
}
//模拟二分搜索