[SWEA]ギャラリーまでお酒を飲む[PYTHON]


高校生たちは学校で修練会に参加した.修練会に通う生徒たちは、友人たちと一緒に飲酒ダンスを楽しみ、夜12時になると、助教たちの目を避けるため、自分の部屋に戻る準備をしていた.
一人の学生が時間通りに自分の部屋に戻らなかったことに気づいたら、大変なことになるので、最短時間ですべての学生が自分の部屋に戻りたいと思っています.
寮は廊下に沿って400室あり、以下のように並んでいます.
すべての生徒は今の位置から自分の部屋に戻りたいと思っていますが、2人の生徒が自分の部屋に戻ると、通った廊下の区間が重なると、2人の生徒が同時に帰ることができません.
例えば、(部屋1->4)と(部屋3->6)の廊下が重なり、一人で待つ必要があり、その後移動します.距離に関係なく移動には単位時間が必要です.
各学生の現在の部屋の位置と戻る部屋の位置をリストする場合は、最小数の単位時間ですべての学生が移動できる位置を見つけてください.

[入力]
入力はT(≦10)個の試験箱からなる.各テストケースの最初の行には、戻る学生数Nが与えられる.
以下のN行は、各学生の現在の部屋番号(≦400)と、戻る部屋番号(≦400)を与える.与えられた2 N個の部屋番号に重複はない.
[出力]
テストケースTの結果は「#T」であり、各テストケース1行に1つの所要時間が出力される.
この考えはまだ解けていない.

# 세트 번호의 방을 같은 숫자로 바꿔주기 
# ex, 1번 2번 방은 1이 되고
# 3번, 4번 방은 2가 됨
# 그렇게 총 200개의 숫자가 나옴.
def div(num):
    return (int(num)+1) // 2

# 밑에 쓸 max 함수 미리 만들어 두기
def maxmax(data):
    max_value = data[0]
    for i in range(len(data)):
        if data[i] > max_value:
            max_value = data[i]
    return max_value

for tc in range(1, int(input()) +1):
    N = int(input())
    # 학생 방 번호를 받아서 복도의 번호로 바꾸는 작업
    yo = [list(map(div, input().split())) for _ in range(N)]

	# 복도 카운팅 할 빈 리스트 생성
    corridor = [0] * 201

	# 혹시나 하니 swap 해주기
    for i in range(N):
        if yo[i][0] > yo[i][1]:
            yo[i][0], yo[i][1] = yo[i][1], yo[i][0]

	# 드뎌 카운팅 해주기
    
        for k in range(yo[i][0], yo[i][1]+1):
            corridor[k] += 1

	# 카운팅한 아이들 중 가장 큰 아이를 반환
    print('#{} {}'.format(tc, maxmax(corridor)))
    

  • まず、yo=[list(map(div,input().split()))for inrange(N)]このセクションでは、intではなくmapで予め作成されたdiv関数を受け取ります.

  • ここでは単数の部屋の上、偶数の部屋が下なので、1,2,3,4のように対面する子供たちを同じ数字で縛ります.バインド方法は(int(数値)+1)/2です.

  • 生徒たちの移動部屋の入力を受けたら、次に通る廊下の番号を算出します.学生たちは歩いた廊下を数えて、一番多い番号に戻ればいいです.

  • その前に!大きい部屋から小さい部屋まで学生がいるかもしれませんが、その場合は交換できます

  • 後でカウントをチェック

  • max関数を事前に作成し、カウントされた廊下数で最大値を返す場合は~~を閉じます.

  • 私のネズミはどうやって思いついたの??