• POJ 3278


    题目链接:http://poj.org/problem?id=3278

    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

    题意:

    有一条数字线段 $[0,100000]$,已知农场主在位置 $N$,逃亡的奶牛在位置 $K$ 不移动,现在农场主在每一分钟都可以有三种行进方式:

    往右走一步,往左走一步,传送到为当前位置的两倍的地方;

    求最短多少分钟可以抓到奶牛。

    题解:

    显然是BFS,农场主每行进一次,相当于BFS往下搜一层,那么所有BFS搜索到的位置的深度就相当于行进时间(并且就是到达这个位置的最短时间),

    如果某一层遇到了奶牛,就直接终止BFS即可。

    时间复杂度:所有的点只会进队一次,$O(N)$。

    AC代码:

    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    const int maxn=100000;
    
    int n,k;
    int d[maxn+10];
    bool vis[maxn+10];
    
    inline bool ok(int x)
    {
        if(0<=x && x<=maxn) return 1;
        else return 0;
    }
    void bfs()
    {
        queue<int> q;
        q.push(n);
        d[n]=0;
        vis[n]=1;
        while(!q.empty())
        {
            int now=q.front(); q.pop();
            if(now==k) return;
            int x1=now+1,x2=now-1,x3=2*now;
            if(ok(x1) && !vis[x1]) q.push(x1),d[x1]=d[now]+1,vis[x1]=1;
            if(ok(x2) && !vis[x2]) q.push(x2),d[x2]=d[now]+1,vis[x2]=1;
            if(ok(x3) && !vis[x3]) q.push(x3),d[x3]=d[now]+1,vis[x3]=1;
        }
    }
    
    int main()
    {
        cin>>n>>k;
        memset(vis,0,sizeof(vis));
        bfs();
        cout<<d[k]<<endl;
    }
  • 相关阅读:
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I
    pat 1065 A+B and C (64bit)(20 分)(大数, Java)
    pat 1069 The Black Hole of Numbers(20 分)
    pat 1077 Kuchiguse(20 分) (字典树)
    pat 1084 Broken Keyboard(20 分)
    pat 1092 To Buy or Not to Buy(20 分)
    pat 1046 Shortest Distance(20 分) (线段树)
    pat 1042 Shuffling Machine(20 分)
  • 原文地址:https://www.cnblogs.com/dilthey/p/9678263.html
Copyright © 2020-2023  润新知