- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Found this problem在 hackerrank 中并且未能通过一些测试用例。
一天,Bob 在一张纸上画了一棵树,有 n 个节点和 n-1 个边。他很快发现节点的父节点取决于树的根。下图显示了一个例子:
得知事实后,鲍勃发明了一个令人兴奋的新游戏,并决定和爱丽丝一起玩。游戏规则如下:
Bob 选择一个随机节点作为树的根,并向 Alice 保密所选节点的身份。每个节点被选为根的概率均等。
然后爱丽丝列出了 g 个猜测,其中每个猜测的形式都是 u v 并且意味着爱丽丝猜测 parent(v) =你是真的。保证树中存在连接 u 和 v 的无向边。对于每个正确的猜测,爱丽丝获得一分。如果 Alice 获得至少 k 分(即,她至少 k 的猜测是正确的),她就赢得了比赛。
Alice 和 Bob 玩q 游戏。给定这棵树、爱丽丝的猜测和每场比赛的 k 值,求出爱丽丝赢得比赛的概率,并将其作为 p/q 格式的约分式打印在新的一行上。
解决方法:有一棵树的一些边缘标有箭头。对于树中的每个顶点,您必须计算有多少箭头指向它。对于一个固定的顶点,这可以通过一个 DFS 来完成。在 DFS 期间以与其自身相反的方向遍历的每个箭头都加 1。如果您知道顶点 v 的答案,则可以在 O(1) 中计算与 v 相邻的顶点 u 的答案。 它与v几乎相同,但是如果有箭头u->v或v->u,它们的贡献是相反的。现在你可以通过移动到第二个DFS中的相邻顶点来使顶点u爬过整个图。
问题:无法通过所有测试用例。我对代码进行了健全性测试,没有发现任何问题,但我不知道为什么这在 hackerrank 平台上不起作用。
import sys
def gcd(a, b):
if not b:
return a
return gcd(b, a%b)
def dfs1(m, guess, root, seen):
'''keep 1 node as root and calculate how many arrows are pointing towards it'''
count = 0
for i in m[root]:
if seen[i][root] != 1 and seen[root][i] != 1:
seen[i][root] = 1
seen[root][i] = 1
count += (1 if guess[root][i] == 1 else 0) + dfs1(m, guess, i, seen)
return count
def dfs2(m, guess, root, seen, cost, k):
'''now make every node as root and calculate how many nodes
are pointed towards it; If u is the root node for which
dfs1 calculated n (number of arrows pointed towards the root)
then for v (adjacent node of u), it would be n-1 as v is the
made the parent now in this step (only if there is a guess, if
there is no guess then it would be not changed)'''
win = cost >= k
for i in m[root]:
if seen[i][root] != 1 and seen[root][i] != 1:
seen[i][root] = 1
seen[root][i] = 1
win += dfs2(m, guess, i, seen, cost - (1 if guess[root][i] == 1 else -guess[i][root]), k)
return win
q = int(raw_input().strip())
for a0 in xrange(q):
n = int(raw_input().strip())
m = {}
guess = [[0 for i in range(n+1)] for i in range(n+1)]
seen = [[0 for i in range(n+1)] for i in range(n+1)]
for a1 in xrange(n-1):
u,v = raw_input().strip().split(' ')
u,v = [int(u),int(v)]
if u not in m:
m[u] = []
m[u].append(v)
if v not in m:
m[v] = []
m[v].append(u)
g,k = raw_input().strip().split(' ')
g,k = [int(g),int(k)]
for a1 in xrange(g):
u,v = raw_input().strip().split(' ')
u,v = [int(u),int(v)]
guess[u][v] = 1
cost = dfs1(m, guess, 1, seen)
seen = [[0 for i in range(n+1)] for i in range(n+1)]
win = dfs2(m, guess, 1, seen, cost, k)
g = gcd(win, n)
print("{0}/{1}".format(win/g, n/g))
最佳答案
一种可能是代码是正确的,但您遇到了堆栈溢出。
可以有 100,000 个节点,如果这些节点全部连接成一条线,您的深度优先搜索递归将失败。
如果这是真的,那么将 DFS 代码从递归公式转换为迭代公式(通过在数组中保留一堆要尝试的东西)应该会有所帮助。
另一种可能性是可能有一个猜测如 1,2 和一个猜测如 2,1。在这种情况下,我不确定分数更新代码是否有效:
win += dfs2(m, guess, i, seen, cost - (1 if guess[root][i] == 1 else -guess[i][root]), k)
也许这样会更好:
win += dfs2(m, guess, i, seen, cost - guess[root][i] + guess[i][root], k)
关于python - 树hackerrank解决错误的故事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44840604/
function birthdayCakeCandles(n, ar) { let max = 0; for(let i = 0; i max) { max = ar[i];
我正在尝试解决 https://www.hackerrank.com/challenges/find-hackerrank在 Obj-C 上,并通过 xCode 获得正常输出,但不是通过 hacker
我一直在努力解决这个挑战,并且有点想知道该怎么做。但是经过我所有的尝试,我只能通过测试用例,并且在提交面板中还有一个案例。之后一切都失败了 问题: 一家公司要求简化其产品分配策略,给定 n 个产品,每
问题陈述 :Sherlock and Moving Tiles TL;博士 : 给定 2 正方形;边长为 L,放置在 x-y 平面中,两个正方形 搬家沿线 y=x (沿正 x 和 y)速度为 S1 和
这个问题与this challenge有关在 HackerRank 上。它似乎在某些情况下失败了,但我不清楚算法有什么问题(很多人似乎有超时问题,这不是问题,一切都运行得很快,我看到的所有情况都通过了
我一直在应对这个挑战: Count Triplets ,经过大量的努力,我的算法并没有适用于每个测试用例。 由于在讨论中,我看到了一段代码并试图找出代码的真正功能,但我仍然无法理解这段代码是如何工作的
请参阅最近在 HackerRank 上发布的以下问题 Adam is standing at point (a,b) in an infinite 2D grid. He wants to know
(HakerRank) task是让我格式化测试用例给出的输入。 字符串和整数之间需要有 15 个空格,并且如果只有两位数,则在整数前面附加一个零,我的代码据我所知完成了这一点,并与预期的输出匹配,但
大多数人可能熟悉这个问题,但对于那些不熟悉的人来说: Given 32-bit unsigned integers flip their bits and print the resulting in
给定一个未排序的整数列表,找到它们之间绝对差最小的一对元素。如果有多对,请全部找到。 我的推理是将每个:arr[j] - arr[i] 与lowest 进行比较,如果它小于或等于该值,则将该值添加到数
我正在解决重复字符串 hackerrank 问题。但是所有的测试用例都没有运行可能是我的逻辑不正确。问题是这样的 下面给出了我的代码,其中包含没有变量的repeatedString和countingA
问题的链接如下: https://www.hackerrank.com/challenges/strange-code/problem static long strangeCounter(long
我正在尝试解决this hackerrank 上的问题,我花了一段时间才找到窍门。 技巧在于异或的属性以及数字出现在数组子集中的次数,其中子集是连续的(请注意)。 因此,如果我们有 1,2,3,子集将
我无法理解代码中这一行的用法,有人可以解释一下这个问题或提供一些不同的方法来解决这个问题 问题链接:https://www.hackerrank.com/challenges/15-days-of-l
为了问题陈述,我附上了两张照片。 /image/22zyM.png /image/5c8e6.png 我的代码: for(i=0;i #include #include #include int
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我试图解决this 。我的算法在离线编译器中给出了正确的答案。我不知道错误在哪里。我对 C 语言完全陌生。 该问题要求创建一个函数来查找方阵左右对角线的绝对差。 这是我的网站解决方案。当我在线运行代码
我想创建一个函数来返回一个数组,其中包含完成另一个数组所需的步骤数,但有一个小条件,我只想在 0 上执行步骤,这意味着如果我有数组 c = [0,0 ,0,1,0,0,1,0] 它将把前三个 0 作为
我正在尝试 hackerrank 中的 Morgan and a String 挑战( https://www.hackerrank.com/challenges/morgan-and-a-strin
我是初学者,欢迎替代此代码。输入值后程序崩溃。我也想更多地了解这个问题,因为我已经看过很多次了。 #include #include #include #include using namespace
我是一名优秀的程序员,十分优秀!