[白俊18111]私の世界

6818 ワード

🥚質問する


https://www.acmicpc.net/problem/18111
  • 実施
  • ルーティング転送アルゴリズム

  • 🥚入力/出力



    🍳コード#コード#


    # 출처: https://peisea0830.tistory.com/3
    import sys
    input = sys.stdin.readline
    
    N, M, B = map(int, input().split())
    arr = [list(map(int, input().split())) for _ in range(N)]
    
    # 땅을 고르는 데 걸리는 시간과 높이 저장
    min_time = float('inf')
    max_height = 0
    
    # 기준이 되는 높이 h (0 <= h <= 256)
    for h in range(257):
        # 초기 블록 + 인벤토리에 추가할 블록의 개수 >= 사용해야하는 블록의 개수 -> h로 땅을 고를 수 있음
        in_block = 0
        out_block = 0
        for r in range(N):
            for c in range(M):
                if arr[r][c] > h:
                    in_block += arr[r][c] - h
                else:
                    out_block += h - arr[r][c]
        
        inventory = in_block + B
        if inventory < out_block:
            continue
    
        time = in_block * 2 + out_block
        if time <= min_time:
            min_time = time
            # 시간이 같을 때는 높이가 높은 순으로 출력하라는 조건에 맞게
            # for i in range(257)은 항상 i가 오름차순으로 돌기 때문에
            # 시간이 같아도 최종적으로는ㄴ 높이가 높은 순으로 나오게 된다
            max_height = h
                
    
    print(min_time, max_height)

    🧂アイデア


    BFS


    注意:https://peisea0830.tistory.com/3
  • がどのように実施するか、およびどのように実施時間を短縮するかは、非常に厄介な問題である
  • .
  • 地は何の高さですか?->フルートで0から256の高さ
  • をテスト

  • 上の参照リンクでは、「初期ブロック+在庫に追加するブロック数>=使用するブロック数->h土地を選択できます」ということがわかります.

  • したがって、高さhを作成する際に追加するブロック数、使用するブロック数は、それぞれin block、out blockと統計される.

  • in block+b

  • in block+B>=out blockの場合、所要時間はin_block*2 + out_block です.

  • 最後に、最小時間、最大高さを出力するために、time < min_timeであれば、min time=time、max height=hに更新する.
  • の場合、h > max_heightの認知検査過程を省略できるのは、hが常に昇順に検査されるため、for h in range(257)である.