【问题标题】:Is my approach correct?我的方法正确吗?
【发布时间】:2016-12-30 20:59:33
【问题描述】:

我正在努力解决以下问题:

给定一个具有 3

假设你有 D 美元,并且你在 e_i 边缘正确回答问题的机会是 p_i,那么回答该问题后预期的钱是:

2*Dp_i+1/2(D(1-p_i))=D(1/2+3*p_i/2)

找出给定图表中是否有一个简单的循环,您可以步行,并且步行后预期的钱比您开始时的钱要多。

我的方法是使用 Johnson 的算法找到所有简单的周期,然后检查是否有任何周期的预期资金超过您开始时的金额,但我一直在超时。我错过了什么吗?有没有我必须做的观察,或者我应该尝试更多地优化我的代码?

【问题讨论】:

  • 我觉得这个是给 [Math Overflow] (mathoverflow.com)
  • @T-Heron 是也不是 :-) 一些数学洞察力可以提供很大帮助,但没有它,这是一个算法问题。
  • 是找到一个循环还是检查循环是否存在?
  • 可以使用简单的启发式方法,只考虑 p_i 足够大且系数 >= 1 的边。任何由这些边组成的循环都将具有我们正在寻找的属性。但我想知道,为什么你会得到一些超时?这是一些编程比赛的问题吗?
  • 感谢您的回答。顺便说一句,它来自一个希腊编程培训网站,这就是我说我要暂停的原因,而不是来自跑步比赛

标签: algorithm graph-theory


【解决方案1】:

这个问题的诀窍是将其减少为负循环检测。

如果你从一个顶点的x 金额开始,然后绕过一个循环e_1,e_2,…e_k 并返回,你将得到x*f_1*f_2*…f_k,其中f_i=(1/2+3*p(e_i)/2)。你想要的是f_1*f_2*…f_k > 1。但这与拥有ln(f_1) + ln(f_2) … ln(f_k) > 0 相同。

所以制作一个边权重为-ln(f_k) 的图。然后问题归结为负循环检测,这可以使用一些算法来完成,比如 Bellman-Ford。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多