zoukankan      html  css  js  c++  java
  • POJ 3278, Catch That Cow

    Time Limit: 2000MS  Memory Limit: 65536K
    Total Submissions: 13066  Accepted: 3968


    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
    USACO 2007 Open Silver


    // POJ3278.cpp : Defines the entry point for the console application.
    //

    #include 
    <iostream>
    #include 
    <queue>
    using namespace std;

    int main(int argc, char* argv[])
    {
        
    int N, K;
        cin 
    >> N >> K;

        
    const int MAXSIZE = 200002;
        
    int line[MAXSIZE];
        memset(line, 
    -1sizeof(line));

        queue
    <int> q;
        q.push(N);
        line[N] 
    = 0;

        
    while(!q.empty())
        {
            
    int stp = q.front();
            q.pop();

            
    int next = stp - 1;
            
    if (next >= 0 && line[next] == -1)
            {
                line[next] 
    = line[stp] + 1;
                q.push(next);
                
    if (next==K)
                    
    break;
            }

            next 
    = stp + 1;
            
    if (next < MAXSIZE && line[next] == -1)
            {
                line[next] 
    = line[stp] + 1;
                q.push(next);
                
    if (next==K)
                    
    break;
            }

            next 
    = stp << 1;
            
    if (next < MAXSIZE && line[next] == -1)
            {
                line[next] 
    = line[stp] + 1;
                q.push(next);
                
    if (next==K)
                    
    break;
            }
        }

        cout 
    << line[K] << endl;
        
    return 0;
    }

  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/asuran/p/1580672.html
Copyright © 2011-2022 走看看