[BOJ-4796]キャンプ(Python)


🤒 質問する


BOJ-4796キャンプ

💊 答えを出す。



上の図は大きく2つの状況に分けることができます.
  • 残りの休暇日数が連続P日より大きい場合は
  • である.
  • 残り休暇日数が連続P日未満の場合は
  • である.
    1日の場合、残りの休暇日数からP日を除いた結果(休暇期間にキャンプ場が使える日数)で使える日数Lに加えます.
    2つ目は2つに分けられます
  • 残りの休暇日数が利用可能日数Lより大きい場合、
  • 残りの休暇日数が利用可能な日数L以下である場合、
  • 1つ目の場合、結果にLを付け、結果を返します.
    2つ目の場合、残りの休暇期間中は、できるだけ多くの日数Lのキャンプ場が使えないので、結果的にVを付けて戻ってきます.

    💊 説明する。


    [解答1]と大差ないのですが、
    解答1の1つのステップを결과 += (V를 P로 나눈 값) * Lで解決する.
    次に、VをPの残存値で割って格納し、残存休暇日数Vを算出し、第2の処理を行う.

    ソースコード1

    import sys
    
    def solution(L: int, P: int, V: int):
        result = 0
    
        while True:
            if V - P > 0:
                result += L
                V -= P
            else:
                if V > L:
                    result += L
                else:
                    result += V
                return result
    
    i = 1
    while True:
        L, P, V = map(int, sys.stdin.readline().split())
        if V == 0: break
        print(f"Case {i}: {solution(L, P, V)}")
        i += 1

    ソース2

    import sys
    
    def solution(L: int, P: int, V: int):
        result = 0
        result += (V // P) * L
    
        carry = V % P
        V -= (V // P) * P
        
        if carry > L:
            return result + L
        else:
            return result + V
    
    i = 1
    while True:
        L, P, V = map(int, sys.stdin.readline().split())
        if V == 0: break
        print(f"Case {i}: {solution(L, P, V)}")
        i += 1