【问题标题】:modular arithmetic puzzle codeforces模块化算术谜题代码力量
【发布时间】:2019-09-13 17:17:57
【问题描述】:

一辆汽车以每秒 v 米的速度从 A 点移动到 B 点。动作发生在 X 轴上。在距离 A d 米处有红绿灯。从时间 0 开始,前 g 秒绿灯亮,然后在接下来的 r 秒红灯亮,然后绿灯再次亮 g 秒,依此类推。

汽车可以立即从 0 加速到 v,反之亦然,可以立即从 v 减速到 0。考虑到它在绿灯处立即通过红绿灯。如果汽车在红灯刚亮的瞬间接近红绿灯,则来不及超车。但如果它在绿灯刚亮的那一刻接近红绿灯,它就可以移动。汽车在 0 点离开 A 点。

在不违反交通规则的情况下,汽车从 A 点到 B 点的最短时间是多少?

输入 整数 l, d, v, g, r (1 ≤ l, d, v, g, r ≤ 1000, d 

解决方案

if(g*v>d)
 ans = l/v   // i got it
else
 ceil(d/v/g+r)*(g+r)+(l-d)/v  // i am not getting Please help

示例->假设 l=5 ,d=4,v=1,g=2 ,r=1

在 t=0 时,汽车从 $A $ 起步

在 t=2 时灯变红,但车离灯很远,所以继续行驶没有问题

在 t=3 时,指示灯再次变为绿色,持续 $2$ 秒(直到 $t=5$)

在 t=4 时,灯光仍然是绿色的,我们在灯光下到达

注意->我们已经过红绿灯了别担心

在 t=5 我们到达 B 点

但是正确的 ans = 7 这不是我做错的最低要求?

红色编码员使用了上述方法,我也在下面提供了他的解决方案链接。

请帮助我感到难过,我试图从 3 天开始找到正确的逻辑。

你们是我最后的希望。

问题链接problem b

Accepted solution link of red coder

注意-> 上面接受的解决方案给出了 7 作为输出但我认为它应该是 5。所以这不会是错误的,因为 codeforces 接受了它。

【问题讨论】:

  • 你想问一个问题还是想让别人帮你做这个练习?我建议你阅读this guide,然后编辑你的问题。
  • 我相信您的评估是正确的,并且提供的代码确实会产生错误的结果。第一个条件g * v > d 只是不够笼统,不足以解释到达灯之前的多个灯开关。
  • @NicoSchertler codeforces 接受了那个红色编码器的结果
  • @m.raynal OP 正在寻求帮助以解决逻辑问题。 OP 已经导出了一个解决方案,该解决方案为测试示例提供了5,但一个公认的算法为同一示例生成了7
  • 这只意味着代码通过了codeforces的测试。这并不意味着测试是正确或完整的。

标签: algorithm modular-arithmetic


【解决方案1】:

是的,你是对的,答案应该是 5。

条件g * v > d 没有任何意义。它只是检查您是否可以在第一个绿色阶段通过红绿灯。其实应该是((d + v - 1) / v) % (g + r) < g。首先,我们用(d + v - 1) / v(整数除法)计算在哪一秒通过红绿灯,如果我们使用浮点数,这与ceil(d / v) 相同。然后使用模数,我们计算在绿色红色循环中我们通过红绿灯的位置。如果结果是< g,当它是绿色的时候我们通过了它,解决方案是(double)l / v

您可以使用与上述模数相同的技术来获取我们必须在红绿灯处停止的秒数,然后将从开始到红绿灯的时间(整秒)和从红绿灯开始的时间相加到目的地。或者我们可以计算通过红绿灯时直到绿红循环结束所需的秒数。这就是您所做的,但是您缺少大括号,因此对于浮点数,我们可以使用带有额外大括号的公式:
ceil(d / v / (g + r)) * (g + r) + (l - d) / v

【讨论】:

  • 但是按照您在此处看到的建议修改后仍然给出 7 imgur.com/a/m4N8cmj
  • 所以我可以说我的答案 5 在这里是错误的,但你也说正确的答案应该是 5 请帮助@maraca
  • 上面附加的解决方案也给出了 7 并且被 codeforces 接受了
  • @akacodes121 不,它给出 5,因为 4 % 3 = 1
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多