簡體   English   中英

如何確定最便宜的通勤票組合

[英]How to Determine Cheapest Commute Ticket Combination

當地的火車服務最近添加了一個透析通勤選項。 我正在嘗試確定在給定日期找到給定一組往返旅行的最便宜的票組合的算法。

這是英文問題。 給定一天和每天的騎行,以下哪種組合最便宜。

  • 往返機票,每次往返費用為w
  • 7天連續7天的門票,費用為x ,無限次乘坐。
  • 在連續30個日歷日內無限次乘坐的30天票價y
  • 成本為z的 365天機票,可在365個連續日歷日內無限次乘坐。

由於我很樂意將此限制為一次僅解決一年,我認為日期列表可以很容易地存儲在看起來像這樣的數組中。

{0,0,1,1,1,0,0,2,1,0,0,0,4,0,1,1,...,0,1,1,5}

數量等於每天往返次數。

我可以使用什么算法來確定涵蓋所有行程的最便宜的機票組合?

提示

你可以通過解決子問題來做到這一點:

What is the cheapest combination C[k] to cover all trips from day 0 up to day k?

要計算此子問題的答案,您可以簡單地考慮購買故障單類型的每種情況。 通過解決從0開始並一直工作到365的問題,您可以在解決子問題時使用以前的結果。

例如,假設在第100天您不需要旅行。 那么答案將是C [99],這是前幾天旅行中最便宜的方式。

但是,假設在第101天你需要進行3次旅行。 那么C [101]的答案將是最便宜的:

Buy round trip tickets today: cost 3*w+C[100]
Buy a 7 day ticket 7 days ago: cost x+C[101-7]
Buy a 30 day ticket 30 days ago: cost y+C[101-30]

計算出C [365]后,您可以將其與全年票證的成本z進行比較。

(如果在此過程中您發現自己要求成本C [i] i小於0,則C [i]的值為0.)

這是我在python中的解決方案。 但首先,讓我給出一些背景信息,以便下面的代碼有意義。


問題陳述:

您想購買即將到來的月份的公共交通票。 你知道你將要旅行的日子。 這個月有30天,有3種類型的門票:

  • 1天的機票費用為P2,僅限一天
  • 7天門票費用P7,自購買之日起連續7天有效
  • 30天票價P25,有效期為30個月。

例,

month_travel_days = [1,2,4,5,7,29,30]

從示例旅行天數來看,最低成本為P11,購買7天票價為P7,然后分別購買29日和30日剩余的兩天票價P4。

解決在任何旅行天數列表中最小化購票成本的問題。


from operator import itemgetter

#travel_dates = [1,2,4,5,7,29,30]
travel_dates = [1,3,5,8,9,10]
#travel_dates = range(30)

def normalize(data):
    L = 30
    d1 = []
    for i in xrange(L):
        d1.append(1 if (i+1) in data else 0)
    return d1

def group_func(d):
    L = len(d)
    result = []
    for i in xrange(L):
        s = sum(d[i:i+7])
        result.append((i,s))
    return result

d1 = normalize(travel_dates)
mincost = 0
while True:
    a = group_func(d1)
    a.sort(key = itemgetter(1))
    m = a[-1][1]
    if m < 4:
        break
    for q in a:
        if q[1] == m:
            w = q
            break
    d1[w[0]:w[0]+7] = [0]*7
    mincost = mincost + 7 
mincost = mincost + d1.count(1) * 2
answer = min(25,mincost)
print "minimum cost = " + str(answer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM