bzoj1646:抓住那只牛

1646: [Usaco2007 Open]Catch That Cow 抓住那只牛

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 829  Solved: 393
[Submit][Status][Discuss]

Description

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 <= N <= 100,000) on a number line and the cow is at a point K (0 <= K <= 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X-1 or X+1 in a single minute * Teleporting: FJ can move from any point X to the point 2*X in a single minute. If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上幽发,尽快把那只奶牛抓回来.

他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有

两种办法移动,步行和瞬移:步行每秒种可以让约翰从z处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.

那么,约翰需要多少时间抓住那只牛呢?

Input

* Line 1: Two space-separated integers: N and K

仅有两个整数N和K.

Output

* Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

最短的时间.

Sample Input

5 17
Farmer John starts at point 5 and the fugitive cow is at point 17.

Sample Output

4

OUTPUT DETAILS:

The fastest way for Farmer John to reach the fugitive cow is to
move along the following path: 5-10-9-18-17, which takes 4 minutes.

HINT

Source

Silver

就是简单的bfs吧。然后就是开始不知道要最大到哪里就停止,然后想到其实很明显,每一个点到达另一个点都可以有两种方法,然后ac了

---------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,maxn;
const int nmax=100005;
int q[nmax],v[nmax],d[nmax];
int main(){
 scanf("%d%d",&n,&m);
 maxn=max(n,m)+1;
 memset(d,0x7f,sizeof(d));
 memset(v,0,sizeof(v));
 int l=0;int r=1;
    q[0]=n;
    v[n]=1;
    d[n]=0;
 while(l!=r){
  int tmp=q[l];
  l++;
  if(l==nmax) l=0;
  int dis=d[tmp]+1;
  if(tmp-1>=0&&d[tmp-1]>dis){
   d[tmp-1]=dis;
   if(tmp-1==m)
     break;
   if(!v[tmp-1]){
    v[tmp-1]=1;
    q[r++]=tmp-1;
    if(r==100000)
      r=0;
   }
  }
     if(tmp+1<=maxn&&d[tmp+1]>dis){
      d[tmp+1]=dis;
      if(tmp+1==m)
        break;
      if(!v[tmp+1]){
       v[tmp+1]=1;
       q[r++]=tmp+1;
       if(r==100000)
         r=0;
      }
     }
     if(tmp*2<=maxn&&d[tmp*2]>dis){
      d[tmp*2]=dis;
      if(tmp*2==m)
        break;
      if(!v[tmp*2]){
       v[tmp*2]=1;
       q[r++]=tmp*2;
       if(r==100000)
         r=0;
      }
     }
 }
 printf("%d\n",d[m]);
 return 0;
}

-----------------------------------------------------------------------------------

时间: 2024-08-01 20:06:45

bzoj1646:抓住那只牛的相关文章

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛*

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛 题意: 数轴上,起点在n,终点在k,每次走可以向左走一步或向右走一步或瞬移到当前坐标的两倍位置,问最少走几次.0≤n,k≤100000. 题解: bfs,允许走的位置边界为[0,max(n,k)+1].下界为0原因是如果走到小于0的位置,k≥0,则瞬移和往左走都是南辕北辙,只能向右走,那么一开始就不应该走到小于0的位置导致浪费时间.上界为max(n,k)+1的原因是如果你走到了大于这个数的位置,k必定小于当

BZOJ 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛( BFS )

BFS... -------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define rep( i , n ) for( int i = 0

Catch That Cow抓住那只奶牛(BFS,广度优先搜索)

# **Catch That Cow(抓住那只奶牛)**[题意]:农场主要去追一直逃跑的牛,每次移动有三种选择,位置加一,位置减一,位置乘二,要找到最快的方法让农夫追到牛(也就是移动的次数最少,这个过程是线性的)具体的题目请见:[原题链接:](http://poj.org/problem?id=3278).思路: 从题目中位置移动就可以看出是一个搜索问题,又加上要找最快的方法,也就是在暗示这个是一个广搜题,每次搜索有三个方向,是一个常规题,不过也有细节,请跟随笔者我思路. 代码: #includ

OpenJudge 2971 抓住那头牛

总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 1

2971:抓住那头牛

总时间限制: 2000ms 内存限制: 65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 17

2971 抓住那头牛 noi.openjudge

http://noi.openjudge.cn/ch0205/2971/ 总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数

openjudge 2971:抓住那头牛 解题报告

总时间限制: 2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟. 2.从X移动到2*X,每次移动花费一分钟. 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5

抓住那头牛

[题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0 <= N <= 100000),牛位于点K(0 <= K <= 100000).农夫有两种移动方式: (1)从X移动到X-1或X+1,每次移动花费一分钟: (2)从X移动到2*X,每次移动花费一分钟: 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? [输入描述] 输入两个整数N.K. [输出描述] 输出一个整数,农夫抓到牛所要花费的最小分钟数. [样例输入] 5

OpenJudge 4001:抓住那头牛

题目链接 题解: 这个题可以用广搜来解决,从农夫到牛的走法每次都有三种选择,定义一个队列,把农夫的节点加进队列,然后以这三种走法找牛,队列先进先出,按顺序直到找到牛的位置. 代码: #include<iostream> #include<stdio.h> #include<queue> #include<cstring> using namespace std; int n,k; #define MAX 1e5 const int MAX_N=1e5+5;