༺ཌༀ 吃菠萝的狼 ༀད༻ 2025-02-08 23:16 采纳率: 63.2%
浏览 19

c++_难题 项目汇报

题目内容
G公司里包括老板在内共有N个员工,其中除了1号是老板,剩下的N-1个员工每人各有一个顶头上司。对于每个员工来说,顶头上司的顶头上司也是自己的上司,以此类推,顶头上司的顶头上司的顶头上司……直至老板都是自己的上司。员工可以向自己的任何一个上司汇报工作,然而层级差别越大时汇报工作的效率就越低。在这里,我们规定,员工向顶头上司汇报所花的时间是1,向顶头上司的顶头上司汇报所花的时间是2,以此类推。

现在需给M个员工布置项目工作,M个员工可分为两个类型,一类是产品研发,一类是市场销售。公司希望将两个不同类型的员工结成对子作为一个项目小组。对于结成对子的两个员工,他们需选定两人的某一位共同上司定期汇报项目工作。如果结成对子的两个员工其中一个是另一个的上司,则只需要作为下属的员工向另一个汇报即可,作为上司的员工无需汇报。

G公司希望将这M个员工两两结成对子,问如何规划配对才能使得汇报工作所花时间最多的员工用时最小。如果M个员工无论如何都无法两两配对成功,则输出-1。

输入格式
第一行包含两个正整数N(1≤N≤1000)和M(2≤M≤N),表示公司有N个员工,需给M个员工布置项目工作。

第二到N行,每行包含1个正整数,第i行的整数表示i号员工的顶头上司的编号。

第N+1行到N+M行,每行包含2个整数id(1≤id≤N)和type(type=0或1),表示被布置工作的员工编号和所属类型。

输出格式
输出包含一个整数,为汇报工作所花时间最多的员工的最小汇报时间。若不存在任何配对方案,则输出-1。

样例 1 输入
4 4
4
1
1
1 0
4 1
2 0
3 1
样例 1 输出
1
样例 2 输入
7 6
1
1
2
4
2
3
2 0
3 0
4 1
6 1
7 0
5 1
样例 2 输出
2
子任务
子任务名 评分方式 时间限制 内存限制 说明 分数
默认子任务 求和 1000 ms 512 MB
100

数据范围
对于30%的数据,是一条链。

对于70%的数据,1≤N≤100,1≤M≤20。

对于100%的数据,1≤N≤1000,M为偶数且M≤N。

  • 写回答

6条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-02-08 23:16
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    要解决这个问题,首先我们需要理清楚员工之间的汇报关系以及如何分配项目工作。以下是解题思路以及示例代码。

    解题思路:

    1. 输入解析: 首先读取公司的员工数 N 和需要布置项目工作的员工数 M,然后解析每个员工的顶头上司信息,接着读取参与项目工作的员工及其类型。
    2. 解析汇报关系: 利用解析出来的顶头上司关系,构造一个汇报时间计算的工具。汇报时间遵循规定:向顶头上司汇报耗时1,向其顶头上司汇报耗时2,依此类推。
    3. 配对员工: 因为题目需要将两类员工配对,需要根据其配对的效率进行选择。考虑到配对中的上下级关系,我们需要设计一种方法来计算可能的配对时间,并找出时间最多的员工的最小汇报时间。
    4. 贪心配对策略: 尝试采用贪心算法或动态规划,对每对可行的配对进行遍历和计算,以求得最大汇报时间的最小值。如果无法配对,返回-1。

    示例代码:

    以下是示例代码,实现了上述思路:

    def find_reporting_time(start, end, supervisors):
        # 计算从start到end的汇报时间
        time = 0
        while start != end:
            start = supervisors[start - 1]
            time += 1
        return time
    def generate_supervisor_tree(N, supervisors):
        tree = {}
        for i in range(N):
            if supervisors[i] in tree:
                tree[supervisors[i]].append(i + 1)
            else:
                tree[supervisors[i]] = [i + 1]
        return tree
    def main():
        # 输入
        N, M = map(int, input().split())
        supervisors = [int(input()) for _ in range(N - 1)] + [0]
        
        employees = []
        for _ in range(M):
            emp_id, emp_type = map(int, input().split())
            employees.append((emp_id, emp_type))
        # 分离类型数据
        type0 = [emp[0] for emp in employees if emp[1] == 0]
        type1 = [emp[0] for emp in employees if emp[1] == 1]
        # 如果员工数量非偶数返回-1
        if len(type0) != len(type1):
            print(-1)
            return
        # 构建配对
        max_time = float('inf')
        for id0 in type0:
            for id1 in type1:
                time0 = find_reporting_time(id0, supervisors[id0 - 1], supervisors)
                time1 = find_reporting_time(id1, supervisors[id1 - 1], supervisors)
                max_time = min(max(max_time, time0), max(max_time, time1))
        print(max_time)
    if __name__ == "__main__":
        main()
    

    代码说明:

    • find_reporting_time 函数: 计算从一个员工到另一个员工的汇报时间。
    • generate_supervisor_tree 函数: 构建员工的上司关系树(可选,但在本问题中未直接使用)。
    • main 函数: 输入读取和处理逻辑,分离员工类型并进行配对。

    注意事项:

    • 代码中的 find_reporting_time 函数通过直接遍历上司关系树来计算汇报时间,简化了逻辑。
    • 样例中提供了两种情况,代码需确保在无合理配对时输出 -1
    • 本代码假设输入始终有效,因此没有包含输入有效性检查。 根据这个框架,您可以根据具体需求进一步优化代码和算法。
    评论

报告相同问题?

问题事件

  • 创建了问题 2月8日