algorithm - 一种无需枚举天数即可计算外国人居住地的算法?

标签 algorithm days

我经常去的国家/地区的签证条件包括以下限制:

“您可以在任何 180 天的时间内在 [国家/地区] 最多居住 90 天”

给定一对日期(进入和退出日期)的暂定列表,是否有一种算法可以告诉我,对于每次访问,我是否会合规,以及有多少天?

显然,一种方法是构建大量单独的天数,然后沿着它滑动一个 180 天的窗口,计算居住天数。但我想知道是否有一种更优雅的方法,它不涉及构建一长串天数。

最佳答案

虽然它也可以看作是一维动态编程算法,但通常的算法基本上是一种贪心算法。基本上,不是一次滑动窗口 1 天,而是一次滑动 1 个开始日期。像这样:

first_interval = 0
last_interval = 0
for first_interval = 0 to N:
    # include more intervals as long as they (partially) fit within 180 days after the first one
    while last_interval < N and A[last_interval].start - A[first_interval].start < 180:
        last_interval += 1
    calculate total number of days in intervals, possibly clipping the last one

剪辑最后一个间隔的需要使得它不如其他方式那么优雅:在类似的算法中,不是每次都求和,而是将其添加到附加间隔(当递增 last_interval 时)并减去从它开始留守间隔(当递增 first_interval 时)。您可以在此处对倒数第二个间隔执行类似的操作,但除非您遇到严重的性能限制,否则最好不要这样做。

关于algorithm - 一种无需枚举天数即可计算外国人居住地的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45676752/

相关文章:

c - 计算偶数和奇数的程序

c++ - 运行 Brute Force 算法时出错?

algorithm - 如何从 N 个纹理生成一个纹理?

linux - 使用 Bash 迭代计算斐波那契数

php - 计算剩余天数

java - joda time plusDays forPattern ("dd/mm/yyyy") 不切换到下个月

algorithm - 如何在线性时间内找到无向图中不同最短路径的数量?

perl - 如何计算Perl中两个日期之间的天数?

javascript - 在Moment.js中做diff,今天等于今天和明天,返回-0。为什么?

date - 如何在 jqGrid 中对 "days ago"格式的日期进行排序?