找到最好的时间来改变其他时间最少



我想找到最好的公共时间来改变其他时间最少(差异的总和是最小的可能)。

在输入时,我有一个数组的时间

在输出中,应该有新的,共同的时间。

请注意,时间可以不排序,可以是绝对不同的(例如02:00,02:30和03:30)

示例1

输入:["01:00", "02:00", "03:00", "04:00", "05:00"]

输出应为03:00,因为最好将01:00更改为03:00(2小时更改),02:00更改为03:00(1小时更改),03:00保持不变,04:00更改为03:00(1小时),05:00更改为03:00(2小时)。

示例2

输入:["12:00", "13:00", "14:00"]

输出应该是13:00-改变12:00到13:00(1小时)和14:00到13:00(1小时)

例3(棘手)

输入:["23:00", "01:00", "02:00"]

输出应该是01:00-更改23:00到01:00(2小时)和02:00到01:00(1小时)(棘手的是23:00 -最佳时间不是)13:00)

我尝试了使时间平均的函数,例如https://stackoverflow.com/a/52839039/19022995,但不幸的是它不起作用

如果你能告诉我如何做这件事,我将非常感激。

提前谢谢你

引理:最佳答案与给定时间中的一个一致。

为了证明它,考虑一个不与任何给定时间重合的解。试着向前移动一点,然后向后移动一点。至少在其中一种情况下,总差异没有增加。所以,继续朝那个方向移动,直到你到达一个给定的时间。


现在剩下的是写一个函数来计算差异,考虑从23:59到00:00的包围。

之后,将每个给定的时间作为候选答案进行尝试,计算每次的总差值,并选择最佳答案作为最终答案。

在伪代码:

time (h, m) = h * 60 + m
diff (t1, t2) = min (abs (t1 - t2), 60 * 24 - abs (t1 - t2))
t[0..n) = given times
total (x) = sum {diff (x, t[i])} for i in [0..n)
answer = arg min {total (t[i])} for i in [0..n)

一种方法是寻找最小的"窗口";包含了所有的时间。要做到这一点,请对时间进行排序(简单地),并将每次都视为"第一次"。例如,在您的第三个示例中,将1:00作为第一次考虑将导致22小时的窗口(因为这使得"最后";时间23:00);考虑到2点是第一次那么就有23个小时的时间窗口;但考虑到23:00是第一次,那就有3个小时的时间。从那里,简单地计算相对于第一次,计算差异mod 24。

最新更新