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

Find the best time to change the other times the least

我想找到最好的共同时间来改变其他时间最少(差异之和尽可能低)。

在输入时,我有时间数组。

输出时,应该有新的常用时间。

注意时间可以不分先后顺序,完全不同(例如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)

我尝试了计算时间平均值的函数,例如,可惜不行

如果能提供有关如何执行此操作的提示,我将不胜感激

提前致谢

引理:最佳答案与给定时间之一一致。

为了证明这一点,考虑一个与任何给定时间都不重合的解。尝试将其向前移动一点,然后向后移动一点。在至少一种情况下,总差没有增加。因此,继续朝那个方向移动,直到达到给定时间之一。


现在剩下的就是编写一个计算差值的函数,考虑从 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)

一种方法是寻找包含所有时间的最小“window”。为此,请(天真地)对时间进行排序,并将每次都视为“第一次”。例如,在您的第三个示例中,将 1:00 视为第一次会导致 22 小时 window(因为那是“最后”时间 23:00);考虑 2:00 作为第一次将导致 23 小时 window;但考虑到 23:00 作为第一次会导致 3 小时 window。从那里,简单地计算相对于第一次,计算差异 mod 24.