字节跳动夏令营2021笔试题T3

 题目

一个公司为每一个员工买衣服,有D,E,F三种衣服,
每一种衣服给员工i的开心值分别为Di,Ei,Fi,
但是员工不愿意和他的直系boss衣服一样,
求所有人开心值和的最大值。

输入:
n,代表n个员工
n行,第i行 为Di,Ei,Fi
下面n-1行 每一行为 a b 代表a是b的直属boss

样例输入:
3
2 4 9
1 3 5
1 2 3
0 1
0 2
样例输出:
14

0号选F,1号选E,2号选E,9+3+2=14

方法

依次遍历所有情况(3**n种),排除直属领导和员工衣服一样的情况。

index  存放每个员工所选的衣服编号,构造成一个三进制的数,每一位上的0或1或2代表员工所选的衣服,每次遍历末位加1,

memory  存放当前index下每位员工的开心值

 

代码

from typing import List


class Solution:

    # 暴力遍历每一种情况,index长度为n,每个值(0,1,2)对应员工所选的衣服,三进制的方式
    def increase(self, index: List[int]):
        index[0] += 1
        for i in range(0, len(index) - 1):
            if index[i] == 3:
                index[i] = 0
                index[i + 1] += 1
        return index

    def maxHappy(self, n: int, arr: List[List[int]], boss: List[List[int]]):
        max = 0
        memory = []  # 存放开心值
        index = [0] * n  # index存放 0 1 2 ,n个值对应n个员工选的衣服
        for i in range(0, 3 ** n):      # 一共有3**n种情况
            for j in range(0, n):
                memory.append(arr[j][index[j]])
            if self.isNotBoss(index, boss):     # 不存在直属领导和员工衣服一样的情况
                if max < sum(memory):
                    max = sum(memory)
            index = self.increase(index)        # 下一种情况
            memory = []
        return max

    # 判断当前序列中是否包含直属领导和员工衣服一样的情况,不存在则返回True
    def isNotBoss(self, index: List[int], boss: List[List[int]]) -> bool:
        for i in range(0, len(boss)):
            if index[boss[i][0]] == index[boss[i][1]]:
                return False
        return True


s = Solution()
n = 3
arr = [[2, 4, 9],
       [1, 3, 5],
       [1, 2, 3]]
boss = [[0, 1],
        [0, 2]]
"""
n = 4
arr = [[2, 4, 9],
       [1, 3, 5],
       [1, 2, 3],
       [5, 7, 1]]
boss = [[0, 1],
        [0, 2]]
"""
print(s.maxHappy(n, arr, boss))

 

你可能感兴趣的:(算法,python,算法,leetcode)