[Sart]Boj 1597:矢印を描く
2391 ワード
[Sart]Boj 1597:矢印を描く
link: https://www.acmicpc.net/problem/15970
質問する
位置が直線上の0、1、2...等非負の数の整数を一定の間隔で右に置きます.これらの位置の各位置には点があります(<図1>).指定点の位置が違います.2点間の距離は、2点位置の数の差を表します.<図1>には4つの点が与えられ、点aとbの距離は3である.
各点にN色のうちの1つがあります.私服、色は1からNの数字で表します.
各点pについて、pから始まる直線矢印を用いて別の点qに接続しようとする.ここで、点qはpのような色の点の中でpに最も近い点であるべきである.最近の点が2つ以上あれば、勝手に1つ選んでください.
各点について、常に同じ色の異なる点が存在します.したがって、上記の条件を満たすqまで、各点pから常に矢印を描くことができる.
例えば、点を順次対(位置、色)と表記する場合、a=(0,1)、b=(1,2)、c=(3,1)、d=(4,2)、e=(5,1)と呼ぶ.
以下の<図2>にこれらの点を表示します.ここで、白は1に相当し、黒は2に相当する.
上記の条件で矢印を描画すると、図3に示すように、点aの矢印がcに接続されます.点bとdの矢印は、それぞれdとbに接続されている.また、点cとeの矢印は、それぞれeとcに接続されている.したがって、すべての矢印の長さは、3+3+2+2=13です.
ポイントの位置と色を指定すると、ライタはすべてのポイントから始まる矢印の長さとを出力します.
入力
しゅつりょく
制限
I/O例
コード|Python
import sys
si = sys.stdin.readline
answer = 0
N = int(si())
AB = [[] for _ in range(N)]
dict_AB = {}
#dictionary에 색별로 좌표 저장하기
for i in range(N):
AB[i] = list(map(int,si().split()))
if AB[i][1] in dict_AB:
dict_AB[AB[i][1]].append(AB[i][0])
else:
dict_AB[AB[i][1]] = [AB[i][0]]
#왼쪽 좌표와의 거리
def left(list_,i):
if i == 0: return 100000
else: return list_[i] - list_[i-1]
#오른쪽 좌표와의 거리
def right(list_,i):
if i == len(list_)-1: return 100000
else: return list_[i+1]-list_[i]
#dictionary에 각 색별 최소거리 계산 후 정답
for value in sorted(dict_AB.values()):
temp = sorted(value)
sum = 0
for i in range(len(temp)):
sum += min(left(temp,i),right(temp,i))
answer += sum
print(answer)
Screenshot & Output
Reference
この問題について([Sart]Boj 1597:矢印を描く), 我々は、より多くの情報をここで見つけました https://velog.io/@kakasi18/Sort-Boj15970-화살표-그리기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol