题解 | #牛牛掷硬币#

算法交流群

http://www.nowcoder.com/practice/397cf1012db14edebe6e91479d536171

根据题意,我们可以建立一个有向无环图,并统计其入度,之后在图上进行拓扑排序,每次当我们遍历到一个节点时,判断其是否可以解决自身产生的问题,同时我们记录每个成员当前所接受的其他问题,分别统计解决问题个数即可。

import collections
class Solution:
    def solve(self , n , a , p , k ):
        # write code here
        ans = [0] * n
        edges = collections.defaultdict(int)
        indegree = [0] * n
        for i in range(n - 1):
            edges[i + 1] = p[i] - 1
            indegree[p[i] - 1] += 1

        queue = []
        que = collections.defaultdict(list)
        visited = set()
        for i in range(len(indegree)):
            if indegree[i] == 0:
                queue.append(i)
                visited.add(i)

        while queue:
            cur_node = queue.pop(0)
            if cur_node == 0:
                g = -1
            else:
                g = edges[cur_node]

            if k[cur_node] <= a[cur_node]:
                ans[cur_node] += 1
            else:
                if g != -1:
                    que[g].append(k[cur_node])
            for q in que[cur_node]:
                if q <= a[cur_node]:
                    ans[cur_node] += 1
                else:
                    if g != -1:
                        que[g].append(q)
            if g != -1:
                indegree[g] -= 1
                if indegree[edges[cur_node]] == 0 and edges[cur_node] not in visited:
                    visited.add(edges[cur_node])
                    queue.append(edges[cur_node])
        return ans
全部评论

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务