菜的很的我又被踩了 耻辱#6
T1 meet
题目大意:
数轴上两个点x y 可以左移 右移1单位 或坐标*2 求最少步数
思路:
sb题 bfs就完事了
(我更sb 开始想错了以为有负数开小了空间)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #define inf 2139062143 11 #define ll long long 12 #define MAXN 300100 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();} 18 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 //yyc score=0 22 int n,k,q[MAXN<<3],l,r,vis[(MAXN<<1)+100]; 23 int main() 24 { 25 freopen("meet.in","r",stdin); 26 freopen("meet.out","w",stdout); 27 n=read(),k=read();q[l=r=1]=n,vis[n]=1;int x; 28 if(n>=k) return printf("%d\n",n-k)&0; 29 while(l<=r) 30 { 31 x=q[l++]; 32 if(x==k) break; 33 if(!vis[x+1]) vis[x+1]=vis[x]+1,q[++r]=x+1; 34 if(!vis[x-1]&&x-1>=0) vis[x-1]=vis[x]+1,q[++r]=x-1; 35 if(!vis[x*2]&&x*2<=4*k) vis[x*2]=vis[x]+1,q[++r]=x<<1; 36 } 37 printf("%d\n",vis[k]-1); 38 }