zoukankan      html  css  js  c++  java
  • 牛客寒假5-D.炫酷路途

    链接:https://ac.nowcoder.com/acm/contest/331/D

    题意:

    小希现在要从寝室赶到机房,路途可以按距离分为N段,第i个和i+1个是直接相连的,只需要一秒钟就可以相互到达。

    炫酷的是,从第i个到第i+2pi+2p个也是直接相连的(其中p为任意非负整数),只需要一秒钟就可以相互到达。

    更炫酷的是,有K个传送法阵使得某些u,v之间也是直接相连的,只需要一秒钟就可以相互到达,当然,由于设备故障,可能会有一些u=v的情况发生。

    现在小希为了赶路,她需要在最短的时间里从寝室(编号为1)到达机房(编号为N),她不希望到达这N个部分以外的地方(不能到达位置N+1),也不能走到比自己当前位置编号小的地方(比如从5走到3是非法的)。

    她想知道最短的时间是多少。

    思路:

    bfs,先进对传送点,在进入i+2^p的最大点,或者,某个点存在传送门也进队。

    感觉是个假算法。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MAXK = 20;
    
    struct Node
    {
        int _w;
        int _step;
        Node(int w,int step):_w(w), _step(step){}
    };
    pair<int, int> C[MAXK];
    
    int Quick_M(int t)
    {
        int x = 2;
        int res = 1;
        while (t > 0)
        {
            if (t&1)
                res *= x;
            x *= x;
            t >>= 1;
        }
        return res;
    }
    
    int main()
    {
        int n,k;
        cin >> n >> k;
        for (int i = 1;i <= k;i++)
            cin >> C[i].first >> C[i].second;
        queue<Node> que;
        que.emplace(1,0);
        while (!que.empty())
        {
            //cout << 1 << endl;
            Node now = que.front();
            if (now._w == n)
                break;
            for (int i = 1;i <= k;i++)
            {
                if (C[i].first == now._w)
                {
                    if (C[i].second <= now._w)
                        continue;
                    que.emplace(C[i].second, now._step + 1);
                }
            }
            for (int i = 0;i <= 30;i++)
            {
                LL tx = now._w + Quick_M(i);
                if (tx > n)
                {
                    que.emplace(now._w + Quick_M(i - 1), now._step + 1);
                    break;
                }
                else
                {
                    for (int i = 1;i <= k;i++)
                    {
                        if (C[i].first == tx)
                        {
                            if (C[i].second <= tx)
                                continue;
                            que.emplace(tx, now._step + 1);
                        }
                    }
                }
            }
            que.pop();
        }
        cout << que.front()._step << endl;
    
        return 0;
    }
    

      

  • 相关阅读:
    Selenium Webdriver 自动化测试开发常见问题(C#版)VS
    HTML 和 Body 在 CSS 中的区别
    安装SDK时出现Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xml
    配置好Java和SDK的环境变量后,Javac不是内部命令
    关于adb连接手机offline的问题解决
    CSDN上总结的测试工具排名
    关于性能优化
    关于WAS_1
    IIS服务器搭建
    关于WAS
  • 原文地址:https://www.cnblogs.com/YDDDD/p/10353798.html
Copyright © 2011-2022 走看看