【华为OD机试真题 C语言】47、 We Are A Team | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
      • 样例2
    • 二、思路参考
    • 三、代码参考
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


题目描述

总共有n个人在机房,每个人有一个标号(1<=标号<=n) ,他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在
一个团队中,具体的:
 
1、消息构成为abc,整数a、b分别代表两个人的标号,整数C代表指令
 
2、c = = 0 代表a和b在一个团队内
 
3、c == 1代表需要判定a和b的关系,如果a和b是一个团队,输出一行’we are a team’,如果不是, 输出一行 ‘we are not a team’
 
4、c为其他值,或当前行a或b超出1~n的范围,输出 ‘dapianzi’


输入输出

输入
1、第一行包含两个整数n, m(1<=n,m<00000),分别表示有n个人和m条消息
2、随后的m行,每行一条消息,消息格式为: a b c(1<=a,b<=n,0<=C<=1)
 
输出
1、c ==1,根据a和b否在一个团队中输出一行字符串,在一个团队中输出we are a team’,不在一个团队中输出 ‘we are not a team’
2、c为其他值,或当前行a或b的标号于1或者大于n时,输出字符串 ‘dapianzi’
3、如果第一行n和m的值超出约定的范围时,输出字符串"Null".


样例1

输入
5 7
1 2 0
4 5 0
2 3 0
1 2 1
2 3 1
4 5 1
1 5 1

输出
We are a team
We are a team
We are a team
We are not a team

样例2

输入
5 6
1 2 0
1 2 1
1 5 0
2 3 1
2 5 1
1 3 2

输出
we are a team
we are not a team
we are a team
dapianzi

二、思路参考

1、首先,我们定义一个数组 team 来表示每个人所属的团队。初始时,每个人的团队编号都是其自身的标号

   我们需要遍历收到的消息,根据不同的指令进行相应的判断:
   
      如果指令 c 为 0,表示消息中的两个人在同一个团队,我们将其中一个人的团队编号更新为另一个人的团队编号。
      
      如果指令 c 为 1,表示需要判断两个人的关系。我们查找两个人所属的团队编号,如果相同则输出 "we are a team",否则输出 "we are not a team"
      
      如果指令 c 不是 01,或者消息中的人的标号超出了范围,我们输出 "dapianzi",表示指令或标号无效。
      
最后,我们输出每条消息对应的结果。

三、代码参考

#include 

#define MAX_TEAM_SIZE 100000

int findTeam(int team[], int person) {
    if (team[person] == person) {
        return person;
    }
    return findTeam(team, team[person]);
}

void mergeTeams(int team[], int person1, int person2) {
    int team1 = findTeam(team, person1);
    int team2 = findTeam(team, person2);
    if (team1 != team2) {
        team[team2] = team1;
    }
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);

    int team[MAX_TEAM_SIZE];
    for (int i = 1; i <= n; i++) {
        team[i] = i;  // 初始化每个人所属的团队编号,初始时都是自身的标号
    }

    for (int i = 0; i < m; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);

        if (a < 1 || a > n || b < 1 || b > n) {
            printf("dapianzi\n");  // 标号超出范围,输出 "dapianzi"
            continue;
        }

        if (c == 0) {  // 两个人在同一个团队,更新其中一个人的团队编号
            mergeTeams(team, a, b);
        } else if (c == 1) {  // 判断两个人的关系
            if (findTeam(team, a) == findTeam(team, b)) {
                printf("we are a team\n");
            } else {
                printf("we are not a team\n");
            }
        } else {
            printf("dapianzi\n");  // 非法指令,输出 "dapianzi"
        }
    }

    return 0;
}


作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

你可能感兴趣的:(华为OD机试真题(C语言),华为,c语言,华为OD机试真题,算法,We,Are,A,Team)