競プロ精進ログ

ARC092 C – 2D Plane 2N Points

はじめに

競プロの精進のために学びがあった問題についてまとめています。
目標は AtCoder 水色!

今のレートは茶色です。

問題

ARC092 C – 2D Plane 2N Pointsを解きました。

難易度は水色。

考察

赤玉も青玉も、xでソートしておく。

ある一つの青玉を基準に考えたとき、その青玉とペアになれるのは、xとyの値が青玉未満の赤玉である。

この範囲の中で、xが青玉未満かつ、yが青玉未満の赤玉の中から、最もyの値が「大きい」ものを貪欲的に選択していく。

コード

N = int(input())

R = []
B = []
for i in range(N):
    a,b = map(int,input().split())
    R.append([a, b, False])

for i in range(N):
    c,d = map(int,input().split())
    B.append([c,d, False])

R.sort()
B.sort()
ans1 = 0
for i in range(N):
    bx = B[i][0]
    by = B[i][1]

    max_j = -1
    max_y = -1
    for j in range(N):
        rx = R[j][0]
        ry = R[j][1]
        if R[j][2]:
            continue

        if rx > bx:
            break

        if rx < bx and ry < by:
            if ry >= max_y:
                max_y = ry
                max_j = j

    if max_j != -1:
        R[max_j][2] = True
        ans1 += 1

print(ans1)

まとめ

2部マッチングによる別解があるらしいので今度やる。

‪実世界で超頻出!二部マッチング (輸送問題、ネットワークフロー問題)の解法を総整理!‬ – Qiitaを読んでみたけど力尽きた…。

COMMENT

メールアドレスが公開されることはありません。