iT邦幫忙

0

急!!!求大神幫幫我 (python 問題)

  • 分享至 

  • xImage

可以幫幫我迴圈的部分嗎 拜託了

目前寫到這裡

n_m = input().split(",")
service_time = input().split(",")
appointment = input().split(",")
money = input().split(",")

for i in range(len(b)):
    service_time[i] = int(service_time[i])
    appointment[i] = int(appointment[i])
    money[i] = int(money[i])

n = int(n_m[0])
m = int(n_m[1])

ll = []

for i in range(len(b)):
    a = []
    a.append(service_time[i])
    a.append(appointment[i])
    a.append(i + 1)
    ll.append(a)
    ll.sort()

小智和大比鳥(又譯比鵰)分別後回到故鄉,開了一家按摩店當老闆,每天營業時間為晚上
6:00 到午夜 12:00。小智每天都要把當晚有預約的 n 個客人分給 m 個按摩師。客人編號為 1、2 到 n,按摩師編號則為 1、2 到 m,已知 m ≤ n。每個客人會預約不同的項目,而客人 j 預約的服務需要花 pj分鐘才能完成,一旦完成服務後則小智可以獲得 bj 元的營收。客人們都知道小智按摩店有多熱門,因此預約時不會指定時間或按摩師,完全交由小智安排。即使如此,由於一位按摩師在一個時刻只能服務一位客人,且按摩師人數 m 有限,並且按摩師工時不得超過六小時,即每位按摩師最後一位客人服務結束的時間不得超過 12 點,因此小智可能會必須通知一些客人取消訂位。客人 j 預約時會指定開始時間 rj ,rj = 0 表示晚上 6:00、rj = 1 表示晚上 6:01,依此類推。小智不能讓客人等待超過 30 分鐘(30 分鐘可以,31 分鐘不行);如果讓客人等待超過 30 分鐘,他就會暴怒,因此小智得事前通知他取消訂位。
小智希望能安排工作並最大化每晚的總營業收益,而他使用如下的演算法1。

  1. 先把客人依照服務時間(pj )由小到大排序,優先安排服務時間較短的客人。若服務時間(pj )平手則考慮預約時間(rj ),先分配預約時間較早的客人;再平手則按照客人編號,編號小的客人優先安排。
  2. 排定客人的安排順位後,即依序嘗試幫每位客人安排按摩師與服務的開始時間。幫一位客人安排開始時間時,幫他安排能讓他等最短時間的按摩師,並讓他在能盡量少等的那個時間開始被服務。如果有複數位按摩師滿足此條件,則選編號最小的按摩師。當然,你不能把一位客人的開始時間安排在他預約的時間 rj 之前,且一位按摩師一旦幫一位客人開始服務,就不能中途中斷去服務其他客人,一定要做完才能換下一位客人。如果沒有任何一位按摩師能讓這位客人等在 30 分鐘以內,就放棄這位客戶。一位客人的按摩師與開始時間一經排定(或放棄)就不再更動。請特別注意,在時間不衝突且遵守上述規則的情況下,同一位按摩師已排定的兩段預約之間,是可以再排入一段預約的。
  3. 每排完一個客人,便依照一開始決定的排序安排下一位客人。

你或許覺得這演算法充滿漏洞,不過本課程不是教最佳化演算法,請就給定的演算法做實做即可。

給定所有預約記錄,請使用上面的演算法做安排,並計算一共有幾位客人被服務,以及小智當晚總共能
獲得多少營收。

舉例來說,假設有 5 個客人、3 個按摩師,服務時間依序是 70、50、50、60 與 60 分鐘、預約時間依序是 6:00、6:10、6:00、6:10 與 6:30,而營收依序是 300、300、300、500、500 元,則根據服務時間得到的排序將是 2 與 3 優先,4 與 5 次之,1 最後,再考慮預約時間後將讓 3 優先於 2,以及 4 優先於5,因此最後的排序將是 3、2、4、5、1。進入安排階段,首先我們會把客人 3、2、4 安排給按摩師 1、2、3。接著客人 5 會被安排給按摩師 1(要請他等 20 分鐘,在 6:50 開始被服務),而客人 1 則因為無論安排給哪位按摩師,都要等超過 30 分鐘,因此今晚沒辦法服務他。小智能收取的總營收是後面四位
付出的共 1600 元。

系統會提供數組測試資料,每組測試資料裝在一個檔案裡。在每個檔案中,第一行會有兩個正整
數,分別為客人人數 n 與按摩師人數 m,第二行會有 n 個正整數,分別為各顧客的服務時間 p1、p2直到 pn,第三行會有 n 個正整數,分別為各顧客的預約時間 r1、r2 直到 rn,第四行會有 n 個正整數,分別為各顧客的服務營收 b1、b2 直到 bn,任兩個數字之間用一個逗點隔開。已知 1 ≤ n ≤ 500、1 ≤ m ≤ 20、1 ≤ pj ≤ 180、0 ≤ rj ≤ 300、1 ≤ bj ≤ 1000。

讀入這些資訊後,請依照題目指定的規則,計算並依序印出兩個整數,分別是共幾個客人被服務,以及總營收。兩個數字之間用一個逗點隔開。

舉例來說,如果輸入是:
5,3
70 ,50 ,50 ,60 ,60
0 ,10 ,0 ,10 ,30
300 ,300 ,300 ,500 ,500
則輸出應該是:
4 ,1600
如果輸入是:
5,3
125 ,135 ,105 ,95 ,35
125 ,70 ,235 ,150 ,130
250 ,880 ,210 ,910 ,670
則輸出應該是:
4 ,2040

貓虎皮 iT邦新手 3 級 ‧ 2023-04-04 10:42:14 檢舉
1. 課程題目還敢丟上來啊(誤
2. python code的部分請用「```py」和「```」包起來,至樣才有標色與縮排保留
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-04-04 11:28:45

https://ithelp.ithome.com.tw/upload/images/20230404/20001787DA24z85Zzk.png

在 main function 中,首先讀入輸入的數據,然後按照規則排序客人列表。接下來,初始化按摩師列表和按摩師結束時間列表,然後按照順序排定每一個客人。對於每一個客人,程序會尋找能讓客人等最短時間的按摩師,如果找到符合條件的按摩師,就排定這位客人的按摩師和開始時間,更新按摩師列表和按摩師結束時間列表,並增加收益;否則,就放棄這位客人。最後,程序輸出總收益。

def main():
    # 讀入輸入
    n, m = map(int, input().split())
    customers = []
    for i in range(n):
        p, b, r = map(int, input().split())
        customers.append((i + 1, p, b, r))
    
    # 按照規則排序
    customers = sorted(customers, key=lambda x: (x[1], x[3], x[0]))
    
    # 初始化按摩師列表
    massage_therapists = [[] for _ in range(m)]
    massage_therapists_end_times = [0] * m
    
    # 按照順序排定每一個客人
    revenue = 0
    for customer in customers:
        idx, p, b, r = customer
        
        # 尋找能讓客人等最短時間的按摩師
        selected_massage_therapist = None
        selected_start_time = None
        for i in range(m):
            if massage_therapists_end_times[i] <= r:
                start_time = max(massage_therapists_end_times[i], r)
                if selected_massage_therapist is None or start_time - r < selected_start_time - r:
                    selected_massage_therapist = i
                    selected_start_time = start_time
        
        # 如果有符合條件的按摩師
        if selected_massage_therapist is not None and selected_start_time - r <= 30:
            massage_therapists[selected_massage_therapist].append(idx)
            massage_therapists_end_times[selected_massage_therapist] = selected_start_time + p
            revenue += b
        # 如果找不到符合條件的按摩師,就放棄這位客人
        else:
            pass
    
    # 輸出總收益
    print(revenue)
    

if __name__ == '__main__':
    main()
0
猴子
iT邦新手 4 級 ‧ 2023-04-06 18:43:57
n, m = map(int, input().split(","))  # 客人數 & 按摩師數 5, 3

pj = list(enumerate(map(int, input().split(","))))  # 服務時間 70, 50, 50, 60, 60
rj = list(map(int, input().split(",")))  # 預約時間 0, 10, 0, 10, 30
revenue = list(map(int, input().split(",")))  # 營收 300, 300, 300, 500, 500

m_tmp = [[i, 0] for i in range(m)]
revenues = 0

pj.sort(key=lambda x: x[1])

last = 0
for i, v in pj:
    if v == last:  # 服務時間 相同
        now_rj, last_rj = rj[i], rj[i - 1]
        if now_rj < last_rj:  # 按造預約時間
            tmp = pj[i]
            pj[i] = pj[i - 1]
            pj[i - 1] = tmp

    last = v

# 這邊有點問題 0.0 (還在想要怎默寫比較好)
for i, v in pj:  # 安排階段
    t = m_tmp[i % m]
    if (da := t[1] - rj[i]) <= 30:
        t[1] = da + v
        revenues += revenue[i]
    else:
        n -= 1  # 放棄,減去一個

print(f"{n},{revenues}")

"""
5,3
70 ,50 ,50 ,60 ,60
0 ,10 ,0 ,10 ,30
300 ,300 ,300 ,500 ,500
---
4 ,1600
"""
"""
5,3
125 ,135 ,105 ,95 ,35
125 ,70 ,235 ,150 ,130
250 ,880 ,210 ,910 ,670
---
4 ,2040
"""

先這樣,有一些部分有問題所以答案有誤(家人在叫吃飯先打到這,如果等等有空再看看

我要發表回答

立即登入回答