【牛客】牛客练习赛67-E-牛妹游历城市——位运算优化

牛妹游历城市

https://ac.nowcoder.com/acm/contest/6885/E

E-牛妹游历城市

题面链接

大致题意

给出 个节点的权值,如果两个点的权值 的结果不为 则认为这两个点之间有边相连,且边权为 求问从 走到 点,最短路径为多少

分析

首先不能暴力

因为点数有 个,所有可能的边的数量为

考虑位运算优化

我们准备出 32 个组,对于每一个值,如果这个值 在位置 上有值,即 则这个值划分至这个组中,规定每个值可以属于多个组

对于每个组,我们再定义一个变量表示到达组 中的值需要的边权价值

对于起点 ,我们考虑它的每一个位,如果位 上有值,则认为到达这个位置的组中的其他所有值需要花费 。记录下每个组的花费,然后对被遍历到的每一组中的每一个值进行类似起点的操作,类似 算法进行松弛,直到整个图没有发生更新花费

最后考虑最终点的每一位,找出花费最少的位并输出即可

注意特判起点和终点相同的时候

AC code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

// NOLINTNEXTLINE
ll lowBit(ll x) { return x & (-x); }

void solve() {
    ll _;
    cin >> _;
    for (ll ts = 0; ts < _; ++ts) {
        ll n;
        cin >> n;
        vector<ll> data[40];
        vector<ll> cost(40, LONG_LONG_MAX);
        vector<ll> a(n);
        for (ll i = 0; i < n; ++i) {
            cin >> a[i];
            for (ll j = 0; j < 40; ++j)
                // NOLINTNEXTLINE
                if (a[i] & (1ll << j))
                    data[j].push_back(i);
        }
        if (n == 1) {
            cout << 0 << endl;
            continue;
        }
        queue<ll> q;
        for (ll i = 0; i < 40; ++i) {
            // NOLINTNEXTLINE
            if (a[0] & (1ll << i)) {
                q.push(i);
                // NOLINTNEXTLINE
                cost[i] = 1ll << i;
            }
        }

        while (!q.empty()) {
            ll cur = q.front();
            q.pop();
            for (auto item : data[cur]) {
                for (ll i = 0; i < 40; ++i) {
                    // NOLINTNEXTLINE
                    if ((a[item] & (1ll << i)) && cost[i] > (1ll << i) + cost[cur]) {
                        q.push(i);
                        // NOLINTNEXTLINE
                        cost[i] = (1ll << i) + cost[cur];
                    }
                }
            }
        }

        ll ans = LONG_LONG_MAX;
        for (ll i = 0; i < 40; ++i) {
            // NOLINTNEXTLINE
            if (a[n - 1] & (1ll << i)) {
                ans = min(ans, cost[i]);
            }
        }

        if (ans == LONG_LONG_MAX)
            cout << "Impossible" << endl;
        else
            cout << ans << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
#ifdef ACM_LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    signed localTestCount = 1, localReadPos = cin.tellg();
    char localTryReadChar;
    do {
        if (localTestCount > 20)
            throw runtime_error("Check the stdin!!!");
        auto startClockForDebug = clock();
        solve();
        auto endClockForDebug = clock();
        cout << "Test " << localTestCount << " successful" << endl;
        cerr << "Test " << localTestCount++ << " Run Time: "
             << double(endClockForDebug - startClockForDebug) / CLOCKS_PER_SEC << "s" << endl;
        cout << "--------------------------------------------------" << endl;
    } while (localReadPos != cin.tellg() && cin >> localTryReadChar && localTryReadChar != '$' &&
             cin.putback(localTryReadChar));
#else
    solve();
#endif
    return 0;
}
全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务