[問題解決]白準-1075空港(互いに集合)
9311 ワード
提问链接
問題の説明
今日はシン・スンウォンの誕生日です.
朴スンウォンは誕生日にシン・スンウォン仁川国際空港にプレゼントした.
空港にはGドアがあり、それぞれ1~Gの番号があります.
空港はP機に順番に到着し、gi(1≦gi≦g)の最初の関門の一つに永久的に接続しようとします.飛行機がいずれの搭乗口にも停泊できないと、空港は閉鎖され、その後はどの飛行機も到着できません.
シン・スンウォンは一番多い飛行機を空港に止めて、朴スンウォンを幸せにしたいと思っている.勝元は最大何機の飛行機をドッキングさせることができますか?
入力
第1行は格子の個数G(1≦G≦105)を与える.
2行目は飛行機数P(1≦P≦105)を与える.
その後、P行にgi(1≦gi≦G)を付与する.
しゅつりょく
乗員がドッキングできる最大飛行機数を出力します.
入力例1
4
3
4
1
1
サンプル出力1
2
私の答え
答えを出す。
서로소 집합
で解決しました.各ゲートを異なる集合として表し、飛行機が入ると順次ゲートを受け取る必要があるが、できるだけ大きな番号のゲートを受け取るようにしなければならない.
ドッキングプロセスがマージされます.
Unionプロシージャ(ドッキングされている場合)は、左側のコレクションとマージされます.
コレクションのルートが0の場合、ドッキングはできないと考えられます.
説明する。
白峻で見つけたクイック解答.
コード#コード#
import sys
input = sys.stdin.readline
def find(parent, x):
if parent[x] != x:
parent[x]= find(parent, parent[x])
return parent[x]
def union(parent, a, b):
a = find(parent, a)
b = find(parent, b)
if a<b:
parent[b] = a
else:
parent[a] = b
gate = int(input())
plane = int(input())
parent = [0]*(gate+1)
for i in range(1, gate+1):
parent[i] = i
result = 0
for _ in range(gate):
d = find(parent, int(input()))
if d == 0:
break
union(parent, d, d-1) # 왼쪽 집합과 합집합
result += 1
print(result)
import sys
input = sys.stdin.readline
gate = int(input())
plane = int(input())
gates = [0]*(gate+1)
for i in range(plane):
p = int(input())
while True:
gates[p] += 1
if gates[p] == 1:
break
if gates[p] > p:
print(i)
sys.exit(0)
p -= gates[p]
p+= 1
print(plane)
Reference
この問題について([問題解決]白準-1075空港(互いに集合)), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/ProblemSolving-백준-10755-공항-서로소집합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol