首页 > 其他分享 >华为9.27笔试

华为9.27笔试

时间:2024-09-27 23:02:26浏览次数:1  
标签:tmp 9.27 int res 笔试 ++ 华为 mp unordered

第一题

给出员工(\(n \leq 100\))和对应的亲属关系,询问能否将其分为两个组合,要求亲属不在同一侧。
要求两个组合中第一个数尽量小。

一眼并查集,即员工i的亲属属于同一个集合,生成一个集合编号j。
记录员工i以及与之互斥的点,用于后续获取员工i互斥的集合编号j。

由于要求组合中第一个数尽量小,将0加入到组合1中,并且记录组合1中已有的集合编号。

遍历并查集记录数组,

  1. 每个数互斥的集合不存在组合2中则加入组合2,保证组合2的起始数字最小。
  2. 否则查看其互斥集合号是否存在集合1,如果集合1也存在互斥集合号,则输出-1,否则加入集合1

最后输出两个数组

#include<bits/stdc++.h>  
using namespace std;  
int f[105];  
int find(int x) {  
    if (f[x] == x) return x;  
    return f[x] = find(f[x]);  
}  
void merge(int a, int b) {  
    int sa = find(a);  
    int sb = find(b);  
    if (sa == sb) return;  
    f[sa] = sb;  
}  
int main() {  
    int n;  
    cin >> n;  
    for (int i = 0; i < n; i++) {  
        f[i] = i;  
    }  
    unordered_map<int,int>mp;  
  
    for (int i = 0; i < n; i++) {  
        int tmp;  
        int pre;  
        cin >> pre;  
        while (cin >> tmp) {  
            merge(pre, tmp);  
            if (getchar() == '\n') break;  
        }  
        mp[i] = tmp;  
    }  
    for (int i = 0; i < n; i++) {  
        find(i);  
    }  
  
    vector<int> nums1;  
    vector<int> nums2;  
    unordered_map<int,int>mp1;  
    unordered_map<int,int>mp2;  
    nums1.push_back(0);  
    mp1[f[0]] = 1;  
    for (int i = 1; i <n; i++) {  
        if (mp2.count(f[mp[i]])) {  
            if (!mp1.count(f[mp[i]])) {  
                nums1.push_back(i);  
                mp1[f[i]] = 1;  
            }  
            else {  
                cout << -1 << endl;  
                return 0;  
            }  
        }  
        else {  
            nums2.push_back(i);  
            mp2[f[i]] = 1;  
        }  
    }  
    int n1 = nums1.size();  
    int n2 = nums2.size();  
    for (int i = 0; i <n1; i++) {  
        if (i == n1 - 1) cout << nums1[i] << endl;  
        else cout << nums1[i] << " ";  
    }  
    for (int i = 0; i < n2; i++) {  
        if (i == n1 - 1) cout << nums2[i] << endl;  
        else cout << nums2[i] << " ";  
    }  
  
    return 0;  
}

第二题

给定起始点s,中间点inter和终点e,请问从s出发坐公交经过inter到达终点e乘坐的公交总数为多少?
接下来给出line条公交线路对应的站点。

考虑从中间点inter出发到达两侧,枚举出发的公交路线,得到对应的乘坐总数。
枚举往两侧出发的公交路线号,维持对应的最优公交路线。

bug: 左右侧相同的公交路线可能不仅存在于inter位置,sc函数应该返回最优的路径,最后求出两侧不同的公交路线数目。当前代码求取的是转车次数。(反正能过样例)

ps: 并查集检测能到达输出3,不能到达输出-1也能骗60%呢

#include<bits/stdc++.h>  
using namespace std;  
int main() {  
    int starte,intere,ende,lines;  
    cin >> starte >> intere >> ende;  
    cin >> lines;  
  
    unordered_map<int, vector<int>>mp;  
    for (int i = 0; i < lines; i++) {  
        int num;  
        cin >> num;  
        for (int j = 0; j < num; j++) {  
            int tmp;  
            cin >> tmp;  
            if (mp.count(tmp)) mp[tmp].push_back(i);  
            else mp[tmp] = vector<int>{i};  
        }  
    }  
    unordered_map<int, int>edges[505];  
    for (auto[k,v]:mp) {  
        int m = v.size();  
        for (int i = 0; i < m; i++) {  
            for (int j = i + 1; j < m; j++) {  
                if (!edges[v[i]].count(v[j])) edges[v[i]][v[j]] = 1;  
                if (!edges[v[j]].count(v[i])) edges[v[j]][v[i]] = 1;  
            }  
        }  
    }  
    function<int(int,int, int)> sc = [&](int start, int sl, int end) {  
        unordered_map<int,int> result;  
        int ocup[505];  
        memset(ocup,0,sizeof(ocup));  
        for (int i:mp[end]) result[i] = 1;  
        int res = 1;  
        queue<int>q;  
        if (result.count(sl)) return res;  
        else {  
            ocup[sl] = 1;  
            q.push(sl);  
        }  
        while (!q.empty()) {  
            res++;  
            int s = q.size();  
            for (int i = 0; i < s; i++) {  
                int t = q.front();  
                q.pop();  
                for (auto[to,_]:edges[t]) {  
                    if (ocup[to] == 0) {  
                        if (result.count(to)) {  
                            return res;  
                        }  
                        q.push(to);  
                        ocup[to] = 1;  
                    }  
                }  
            }  
        }  
        return -1;  
    };  
    unordered_map<int, int>resset1;  
    unordered_map<int, int>resset2;  
    for (int i:mp[intere]) {  
        resset1[i] = sc(intere,i, starte);  
        resset2[i] = sc(intere,i, ende);  
    }  
    int res = 505;  
    for (auto [k1,v1]:resset1) {  
        for (auto [k2,v2]:resset2) {  
            if (v1 == -1 || v2 == -1) continue;  
            if (k1 == k2) res = min(res, v1 + v2 - 1);  
            res = min(res, v1 + v2);  
        }  
    }  
    if (res == 505) cout << -1 << endl;  
    else cout << res << endl;  
    return 0;  
}

标签:tmp,9.27,int,res,笔试,++,华为,mp,unordered
From: https://www.cnblogs.com/tanch25/p/18436750

相关文章

  • 2024.9.27
    枚举定义:定义了一个名为Size的枚举,包含三个常量:SMALL、MEDIUM和LARGE。枚举常量比较:s==t比较Size.SMALL和Size.LARGE,结果为false,因为它们是不同的枚举常量。检查是否为原始类型:s.getClass().isPrimitive()返回false,表明枚举类型不是原始类型,而是对象。使......
  • 华为云技术专家分享4大举措,助力开发者开启鸿蒙原生应用开发
    本文分享自华为云开发者联盟公众号《DTSETechTalk|第66期:鸿蒙上云,加速开发者成长。》本期DTSETechTalk直播主题是《鸿蒙上云,加速开发者成长》,华为云HarmonyOSDTSE技术布道师芝诺在本议题中与开发者们交流华为开发者生态、鸿蒙生态愿景与进展,以及华为云开发者创新中心为开......
  • 9.27
    因为昨天部署成功服务器,所以把云服务器关机了,但是当我再重启时,更换了公网IP,再进行重新打包时,前端便库库报错,这次搞了好久才搞好,所以总结一下前后端都需要改哪里。前端1、部署在云服务器上的前后端通信时,前端向后端通信时需要的是公网IP。 2、部署时需要修改nginx的配置......
  • 【2024.09.27】NOIP2024 赛前集训-刷题训练(3)
    【2024.09.27】NOIP2024赛前集训-刷题训练(3)「NOIP2018提高组」铺设道路算法一:模拟正常人铺路的过程,每次找区间的最小值,最小值就是本次填的高度,由于出现了若干个0位置,就分裂成若干个子区间去重复上述过程,直到全部变成0。时间复杂度\(O(nlogn)\),瓶颈在预处理st表。算法二:若......
  • 9.27
    1、枚举类型:可以使用“==”和equals()方法直接比对枚举变量的值,是引用类型。2、反码、补码和原码:原码,有符号位和数值部分,0为整数,1为负数。10000101为-5。反码,正数反码与原码相同,负数反码在原码的基础上符号位保持为1,数值部分取反。11111010为-5反码。补码,正数不变,负数为反码加1.11......
  • 2024.9.27校测
    T1题目描述\(Mr.Hu\)开了个饭店,来了两位客人:\(Alice\)和\(Bob\),他们吃完饭要结账时,发现他们需要支付\(c\)元钱,但是\(Alice\)只有面值为\(a\)的钱,\(Bob\)只有面值为\(b\)的钱(他们每个人的钱的和都大于\(c\),即可以认为他们有无数张对应面值钱)。现在,\(Mr.Hu\)想知......
  • 2024.9.27
    今天一节课都没去上。反正计概不如自学一点,旷掉也无所谓,感觉。这个比haskell还是有点难绷的,不太懂它都实现了些什么。他要能讲点用这个分析复杂度之类的那还好,但现在的问题是上不去下不来卡在这里了。无论如何把计概作业写了就行。顺便把数算的mooc做了,你12个题我怎么......
  • 9.27 模拟赛(NOIP十三连测 #10)
    2024--梦熊&太戈--NOIP十三连测#10【订正】-比赛-梦熊联盟(mna.wang)复盘开T1。差分转化。模拟了一下样例感觉方案好像是唯一确定的,不需要贪心/DP。但不太能证。想了会感觉找不出反例。然后写完了。对拍没挂。用时不到\(30\)分钟。T2。\(m\le20\)且数据随机感觉很......
  • 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
    本文分享自华为云社区《《华为云DTSE》期刊第四期赋能云专刊,赋能云场景下DTSE服务各类开发者的案例分享》,作者:HuaweiCloudDeveloper。 把公司的开发者平台统一在一起,是华为云所担负的任务,其最终目的是要汇聚开发者、做厚“黑土地”,支撑三大根生态的发展壮大。这也意味着,作为支......
  • VMware安装Ubuntu操作系统 2024.9.27
    1.安装Ubuntu的官方网站是:https://www.ubuntu.com/download点进去可以直接下载文件下载会比较慢,我这点用了约5分钟然后就可以打开vmware,选择:就可以注册和使用了。笔记本电脑是这样的。。如果使用台式机,没有相应的硬件环境的话,就不要创建空的盘符了,就可以创建和导入镜像文......