0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【競技プログラミング】AtCoder Beginner Contest 360_C問題

Posted at

問題

既存投稿一覧ページへのリンク

一覧ページ

解法手順1

  1. 入力を受け取る:

    • N(箱と荷物の数)
    • A(各荷物が最初に入っている箱の番号)
    • W(各荷物の重さ)
  2. 結果を格納する変数 ret を 0 で初期化する。

  3. 各箱に入っている荷物の最大重さを記録する配列 boxes を、長さ N で 0 で初期化する。

  4. 各荷物について以下の処理を行う:

    • 荷物が元々入っている箱の番号 a を取得する(0-indexedに調整)。
    • 荷物の重さ w を取得する。
    • min(boxes[a], w) を ret に加算する。これが移動のコストとなる。
    • boxes[a] を max(boxes[a], w) で更新する。これにより、箱 a に入っている最大の重さを記録する。
  5. 最終的な ret の値を出力する。これが求める最小コストとなる。

ACコード1

ac.py
import logging

def setup_logger(debug_mode):
    logger = logging.getLogger(__name__)
    if not logger.handlers:  # ハンドラが存在しない場合のみ追加
        logger.setLevel(logging.DEBUG if debug_mode else logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        
        file_handler = logging.FileHandler('program_trace.log', encoding="utf8")
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    return logger

def io_func():
    # 入力を受け取る
    N = int(input())  # 箱と荷物の数
    A = list(map(int, input().split()))  # 各荷物が最初に入っている箱の番号
    W = list(map(int, input().split()))  # 各荷物の重さ
    return N, A, W

def solve(N, A, W, logger):
    logger.debug("処理を開始します")
    logger.debug(f"N:: (={N}), A: (={A}), W: (={W})")
    
    # 結果を格納する変数を初期化
    ret = 0
    logger.debug(f"結果変数 ret を {ret} で初期化しました")
    
    # 各箱に入っている荷物の最大重さを記録する配列を初期化
    boxes = [0] * N
    logger.debug(f"boxes 配列を長さ {N} で初期化しました: {boxes}")
    
    # 各荷物について処理を行う
    for i, a in enumerate(A):
        a -= 1  # 0-indexedに調整
        w = W[i]
        logger.debug(f"荷物 {i+1}: 箱番号 {a+1}, 重さ {w}")
        
        # 移動コストを計算し、結果に加算
        ret += min(boxes[a], w)
        logger.debug(f"移動コスト {min(boxes[a], w)}(min(boxes[{a}](={boxes[a]}), {w})) を ret に加算しました。現在の ret: {ret}")
        
        # 箱の最大重さを更新
        boxes[a] = max(boxes[a], w)
        logger.debug(f"{a+1} の最大重さを {boxes[a]}(boxes[{a}]) に更新しました")
        logger.debug(f"boxes: {boxes}")
    
    logger.debug(f"全ての処理が完了しました。最終的な ret: {ret}")
    return ret

def main():
    logger = setup_logger(debug_mode=True)
    N, A, W = io_func()
    result = solve(N, A, W, logger)
    print(result)

if __name__ == "__main__":
    main()

###
# N: 箱と荷物の数
# A: 各荷物が最初に入っている箱の番号のリスト
# W: 各荷物の重さのリスト
# ret: 最小コストを格納する変数
# boxes: 各箱に入っている荷物の最大重さを記録する配列

# 1. io_func関数:
#    - 標準入力から N, A, W を読み取る
#    - 読み取った値を返す
# 2. solve関数:
#    - 引数として N, A, W, logger を受け取る
#    - ret を 0 で初期化
#    - boxes を長さ N の 0 で初期化された配列として作成
#    - A と W をイテレートし、各荷物について:
#      - 箱番号を 0-indexed に調整
#      - 移動コスト(現在の箱の最大重さと荷物の重さの小さい方)を ret に加算
#      - 箱の最大重さを更新
#    - 最終的な ret を返す
# 3. main関数:
#    - logger を設定
#    - io_func を呼び出して入力を取得
#    - solve 関数を呼び出して結果を計算
#    - 結果を出力

メモ

各箱のなかで最大の重さであれば移動せず留まっていて良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?