Project Euler有一个分页文件问题(换句话就是伪装)。
我针对示例数据测试了my code(粘贴以便不会破坏任何人)并获得与问题相同的内存内容+得分。然而,几乎没有一致的分数组合。它要求50转后得分的预期差异。随机抽样分数:
1.50000000
1.78000000
1.64000000
1.64000000
1.80000000
2.02000000
2.06000000
1.56000000
1.66000000
2.04000000
我已经尝试了其中一些作为答案,但没有一个被接受......我知道一些人已经成功,所以我真的很困惑 - 我到底是什么丢失?
答案 0 :(得分:2)
您的问题可能是您似乎不知道Expected Value的定义。
您必须多次运行模拟,并针对每个分数差异,保持出现的频率,然后采用加权平均值来获得预期值。
当然,鉴于Project Euler问题,可能有一个数学公式可以很容易地使用。
答案 1 :(得分:2)
是的,有一个正确的答案。说实话,根据大数定律,蒙特卡罗理论上可以接近期望值。但是,你不想在这里试试。因为实际上每次运行simu时,你会得到一个略微不同的结果,四舍五入到小数点后八位(而且我认为这个设置确实剥夺了任何人甚至想要使用蒙特卡罗的机会)。如果你很幸运,你会有一个simu在经过大量试验后提供答案,因为你提交了所有以前的和失败的。我认为,验证码是欧拉项目让你放弃任何蛮力方法的第二种方式。
嗯,同意Moron,你必须首先弄清楚“预期价值”。这个问题的原则是,你必须找到一种方法来列举50轮后的每一个可能的“必要”结果。每个结果都有自己的| L-R |,所以总结一下,你就会得到答案。不用说,在大多数情况下,蛮力方法都失败了,特别是在这种情况下。幸运的是,我们有动态编程(dp),这很快!
基本上,dp将每一轮的计算结果保存为状态,并在下一个中使用它们。因此,它避免了一遍又一遍地重复相同的计算。这个问题的难点在于找到一种表示状态的方法,也就是说,如何保存临时结果。如果您已经解决了dp中的问题290,那么您可以获得有关如何理解问题并制定状态的一些提示。
实际上,这不是头脑中最困难的部分。最难的部分是你是否意识到两个玩家的某些记忆状态在数值上是不同的,但基本相同。例如,L:12345 R:12345 vs L:23456 R:23456或甚至vs L:98765 R:98765。这是因为呼叫是随机的。这也是我写出可能的“必要”结果的原因。也就是说,您可以将一些状态汇总为一个。只有这样,你的程序才能在合理的时间内完成。
答案 2 :(得分:0)
我会运行你的模拟很多次,然后在所有运行中对| L- R |
值进行加权平均。这应该让你更接近预期的价值。
只提交一个回合作为答案是不太可能的。想象一下,这是骰子卷的预期价值。掷骰子,得分为6,提交为预期值。