zoukankan      html  css  js  c++  java
  • poj3278_kuagnbin带你飞专题一

    Catch That Cow
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 88247   Accepted: 27640

    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 - 1 or + 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){//注意一定要排除>100000的情况,不然会re,也不是>k
                    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;
    }
  • 相关阅读:
    c语言之排序
    c语言中的break 和 continue语句
    c语言之循环
    c语言之选择
    使用函数封装代码
    C语言的运算符
    判断两个对象是否相等:hashcode
    更新线上的资源存在删除和添加的情况-要避免空窗期的实现方法
    变量只能设置一次方法
    JAVA-获取系统信息:内存和系统、PID、内核
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/6701306.html
Copyright © 2011-2022 走看看