[SWEA] 1952. [シミュレーションソフトウェア能力テスト]プール


📚 質問する


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq

📖 に答える


これはソートの問題です.
利用券は4種類あります.
①1日利用券:1日利用可能.
②1ヶ月利用券:1ヶ月以内でご利用いただけます.1ヶ月利用券は毎月1日からです.
③3ヶ月利用券:3ヶ月連続でご利用いただけます.3ヶ月利用券は毎月1日からです.
(11月・12月にも3ヶ月利用券が使用可能/来年の利用券しか購入できないため、3ヶ月利用券は11月・12月・1月・2月期間では使用できません.)
④1年間使用券:1年間使用可能.年間利用券は毎年1月1日からです.
1年間使用した場合は開始時のみなので、最高価格で使用開始します.
1ヶ月目から1日券、1月券、3ヶ月券を使用している場合は、それぞれ呼び直します.
この場合、1日券と1ヶ月券を使用する場合、より高い価格の場合の料金が含まれます.
呼びながら時間をかける.1日券または1ヶ月券にさらに1ヶ月、3ヶ月券に3ヶ月加算します.
11月、12月でも3ヶ月分の利用券が使えますが、現在12月を超えると返却されます.

📒 コード#コード#

def recur(cur, fee):
    global min_fee
    if cur > min_fee:       # 현재 요금이 업데이트 된 최소 요금보다 비싸면 return
        return
    if cur >= 12:           # 12개월을 넘어서는 경우
        min_fee = min(min_fee, fee)     # 최소값 업데이트
        return
    if arr[cur] == 0:
        recur(cur + 1, fee)                     # 이용하지 않으면 다음 월로 이동
    else:
        recur(cur + 1, fee + min(mon, day * arr[cur]))    # 당일 요금은 이용 일만큼 곱한다.
        recur(cur + 3, fee + mon_3)             # 3달은 3달을 더해줘야 한다.


for tc in range(1, 1 + int(input())):
    day, mon, mon_3, year = map(int, input().split())
    arr = list(map(int, input().split()))
    min_fee = year      # 1년 요금은 처음에 넣고 최솟값으로 업데이트
    recur(0, 0)
    print(f'#{tc} {min_fee}')

🔍 結果