Educational Codeforces Round 82B. National Project

4529 단어 codeforces

제목의 뜻

  • $n, g, b$(도로 길이 $n, 맑은 날 수 $g, 비 오는 날 수 $b$)
  • 오늘부터 날씨 맑음 $g일, 비 오는 날 $b일, 맑은 날 $g일...되풀이하다
  • 즉, $g=2달러, $b=3달러면 $gbgbgbgbgb...$
  • 하루에 1길로 갈 수 있어요.맑은 날良い道, 비 오는 날悪い道.
  • 너는 하루에 길을 수리하지 않아도 된다
  • n의 반을 만들어야 한다.나머지는 좋은 길이든 나쁜 길이든良い道
  • 의 절반은 $n=4달러일 때 2달러, n=5달러일 때 3달러 등이다.즉, $cell(n/2)달러의 좋은 길이 있어야 한다
  • 가장 짧게 이 목적을 달성하려면 며칠이 걸립니까?
  • 고찰하다.


    예를 보아도 힌트가 없는 예이기 때문에 그림에 $n, g, b=9, 2$3을 나타낸다.

    빨간색은 좋은 날, 녹색은 나쁜 날, 검은색은 잘 자는 날.
    우선どちらでもよいrg = 必要な良い道rb = その他必要な道rg = ceil(n/2) = 5는 말하지 않아도 알 수 있다.rb = n-rg = 4에만 눈을 돌리면 좋은 도로가 채워진다良い道개의 순환이다.즉, 두 번째 순환 전에 완성해야 하며, 세 번째 순환은 그림과 같이 중도에서 끝날 수 있다.
    다음은 두 번째 순환ceil(rg / g) = xceil(5 / 2) = 3에서 처리할 수 있으며 그 주기는 $b*2달러입니다.($g의 근무일은 모두 제작에 쓰인다どちらでもよい道. 그러나 이 예처럼 중도良い道에 제작이 끝난 경우도 있다.
    이상으로 고려하면 3번째 순환에 들어가는 순간 どちらでもよい道+rg - g*2의 길을 만들어야 한다.여기에서 이미 알고 있는 max(0, rb - b*2)는 위에서 말한 바와 같이 반드시 이 순환에서 완성해야 하기 때문에 필요한 일수는 덧셈에 불과하다.max를 찾은 것은 $rb-b*2달러가 마이너스일 수 있기 때문이다.

    이루어지다

    q = int(input())
    import math
    for _ in range(q):
        n, g, b = map(int, input().split())
        rg = math.ceil(n / 2) # 引くべき良い道
        rb = n - rg # 引くべき、どちらでもよい道
        res = 0
        needcycle = math.ceil(rg / g)  # 何回目で引き終わる?
        # 前まででどこまで引き終わった?
        rg = rg - (g * (needcycle - 1)) # 引かないといけない良い道
        rb = max(0, rb - b * (needcycle - 1)) # 引かないといけないどちらでもよい道
        # 必要な日数というのは 前のサイクルまでの日数+最後のサイクルで必要な日数
        res = ((g + b) * (needcycle - 1)) + (rg + rb)
        print(res)
    

    좋은 웹페이지 즐겨찾기