塔子周赛(二)华为暑期实习-2024年4月24号场
- Status
- Done
- Rule
- IOI
- Problem
- 3
- Start at
- 2025-3-21 19:00
- End at
- 2025-3-21 21:00
- Duration
- 2 hour(s)
- Host
- Partic.
- 44
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
上期我们聊到,你为了帮助小明维护云服务器而大打出手。如今,云服务器已经平稳运行并给用户们提供了一系列不错的服务,但是小明仍花了很多时间在运维和数据分析上。
更形式的,小明为了调研微服务调用情况,对n个微服务调用数据进行了采集分析,微服务使用数字0至n−1进行编号,给你一个下标从0开始的数组edges,其中edges[i]表示存在一条从微服务i到微服务edges[i]的接口调用。
为了更好的维护,小明将形成1个环的多个微服务称为微服务群组,一个微服务群组的所有微服务数量为L,能够访问到该微服务群组的微服务数量为V,这个微服务群组的内聚值H=L−V。
已知提供的数据中有1个或多个微服务群组,请按照内聚值H的结果从大到小的顺序对所有微服务群组(H相等时,取环中最大的数进行比较)排序,输出排在第一的做服务群组,输出时每个微服务群组输出的起始编号为环中最小的数。
第一行输入n,表示有n个微服务
第二行为数组edges,其中edges[i]表示存在一条从微服务i到微服务edges[i]的接口调用,数字以空格分隔。
数据范围:
n == edges.length
2≤n≤105
0≤edges[i]≤n−1
输入保证edges[i]=i
输出排在第一的微服务群组的编号数组,按照环的访问顺序输出,起始编号为环中最小的数,数字以空格分隔。
输入
4
3 3 0 2
输出
0 3 2
解释
0,3,2组成了微服务群组 (环)a,他的L值为3,对于a来说,只有编号为1的1个微服务可以访问到a,因此a的为1答案输出微服务群组为0 3 2
输入
12
2 6 10 1 6 0 3 0 5 4 5 8
输出
0 2 10 5
解释
1,6,3组成了微服务群组(环) a1,L1值为3,编号为4、9的2个微服务可以访问到a1,因此√1值为2,H1为L1V1 =1;
0,2,10,5组成了微服务群组 (环) a2,L2值为4,编号为7、8、11的3个微服务可以访问到2,因此v2值为3,H2为L2-V2=1;
先对比H值,H1=H2,H值相等;
再对比环中序号最大值,a1中最大数为6。a2中最大数为10,a2排前面,因此输出答案为:0 2 10 5
1s, 1024KiB for each test case.
在这道题中,我们需要处理一个包含 n
个微服务的调用关系数组 edges
,其中每个微服务通过数组值指向另一个微服务。我们的目标是识别所有的微服务环群组,计算每个环的内聚值 H = L - V(L 为环中微服务的数量,V 为可以访问该环的其他微服务数量),并根据 H 值进行排序(当 H 值相同时,按环中最大微服务编号排序)。最后,输出 H 值最大的环,确保输出顺序是从环中编号最小的微服务开始。输入包含一个整数 n
和一个长度为 n
的数组 edges
,输出为满足条件的微服务编号,以空格分隔。
思路:BFS遍历
1,6,3组成了微服务群组(环) a1,L1值为3,编号为4、9的2个微服务可以访问到a1,因此√1值为2,H1为L1V1 =1;
0,2,10,5组成了微服务群组 (环) a2,L2值为4,编号为7、8、11的3个微服务可以访问到2,因此v2值为3,H2为L2-V2=1;