zoukankan      html  css  js  c++  java
  • POJ 3278 Catch That Cow(赶牛行动)

    POJ 3278 Catch That Cow(赶牛行动)

    Time Limit: 1000MS    Memory Limit: 65536K

     

    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?

    农夫John被告知有奶牛企图逃跑欲火速擒回。他的初始位置为某条线的N (0 ≤ N ≤ 100,000)点,且奶牛在同一条线上的点K (0 ≤ K ≤ 100,000)。农夫John有两种移动方式:要么走路,要么传送。
    
    * 走路: FJ可以从任意的点X用一分钟移动到 X - 1 或 X + 1
    * 传送: FJ可以从任意的点X用一分钟传送到2 × X
    
    如果牛完全不动,农夫John需要多少时间才能追回它们?
    CN

    Input - 输入

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

    1行:两个由空格分隔的整数:N和K
    CN

    Output - 输出

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

    1行:最短时间,表示农夫John需要多少分钟追回逃跑的奶牛。
    CN

    Sample Input - 输入样例

    5 17
    

     

    Sample Output - 输出样例

    4
    

     

    题解

      判断好条件,开辟两倍的空间(*2),直接SPFA(BFS)。

     

    代码 C++

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 int data[200005];
     5 int main(){
     6     int n, k, now, nxt, i, j;
     7     scanf("%d%d", &n, &k);
     8     k <<= 1;
     9     memset(data, 0x7F, sizeof data); data[n] = 0;
    10     std::queue<int>q; q.push(n);
    11     while (!q.empty()){
    12         now = q.front(); q.pop();
    13         j = now == 0 ? 1 : 3;
    14         for (i = 0; i < j; ++i){
    15             switch (i){
    16             case 0:nxt = now + 1; break;
    17             case 1:nxt = now << 1; break;
    18             case 2:nxt = now - 1; break;
    19             }
    20             if (i<2 && nxt > k) continue;
    21             if (data[nxt] > data[now] + 1){
    22                 data[nxt] = data[now] + 1; q.push(nxt);
    23             }
    24         }
    25     }
    26     printf("%d
    ", data[k >> 1]);
    27     return 0;
    28 }
  • 相关阅读:
    CentOS7使用firewalld打开关闭防火墙与端口
    ssh连接卡在【To escape to local shell, press 'Ctrl+Alt+]'.】的解决方法
    本地链路地址
    RIFF和WAVE音频文件格式
    声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
    VS中C++ 项目重命名
    FFmpeg学习6:视音频同步
    FFmpeg学习5:多线程播放视音频
    FFmpeg学习4:音频格式转换
    FFmpeg数据结构:AVPacket解析
  • 原文地址:https://www.cnblogs.com/Simon-X/p/6290388.html
Copyright © 2011-2022 走看看