zoukankan      html  css  js  c++  java
  • poj3278Catch That Cow

    Catch That Cow
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 88361   Accepted: 27679

    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?

    Input

    Line 1: Two space-separated integers: N and 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

    Sample Output

    4

    Hint

    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.

    Source

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    int que[200001];
    int start=0,endd=0;
    int time[200001]={0};
    int vis[200001]={0};
    int n,k;
    
    int bfs(int n,int k){
        memset(que,0,sizeof(que));
        memset(time,0,sizeof(time));
        memset(vis,0,sizeof(vis));
        start=0;
        endd=0;
        que[endd++]=n;
        vis[n]=1;
        while(start<endd){
            int t=que[start];
            start++;
            for(int i=0;i<3;i++){
                int tt=t;
                if(i==0){
                    tt+=1;
                }else if(i==1){
                    tt-=1;
                }else if(i==2){
                    tt*=2;
                }
                if(tt>100000||tt<0){
                    continue;
                }
                if(!vis[tt]){
                    vis[tt]=1;
                    que[endd]=tt;
                    time[tt]=time[t]+1;
                    if(tt==k){
                        return time[tt];
                    }
                    endd++;
                }
            }
        }
    }
    
    int main()
    {
        int ans;
        while(~scanf("%d %d",&n,&k)){
            if(n<k){
                ans=bfs(n,k);
            }else{
                ans=n-k;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    VC下使用Proc连接Oracle数据库
    解决ORACLE账号system被锁和修改密码
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)[转]
    ckeditor用fckeditor的文件管理器实现图片上传
    video 播放多个视频
    web worker 发送Ajax
    对投影纹理映射的一些思考
    一个光线跟踪的简单实例
    【转载】齐次坐标概念&&透视投影变换推导
    今天开通了cnblog
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/6711393.html
Copyright © 2011-2022 走看看