[白俊]2831号:舞踏会
https://www.acmicpc.net/problem/2831
問題の説明
2
-1800 -2200
1900 1700
上記の場合、男子−2200は女子1900と男子−1800と女子1700とペアを組むとよい.
アルゴリズム#アルゴリズム#
まず、正数の男と負数の女、負数の男の正数の男だけがマッチングできるので、別々に並べます.
男とbpの負数を譲られる男
譲り受けた女性をgp負数の女性にgnという配列に格納する.
(bp,gn)と(gp,bn)はできるだけ多くマッチングしなければならない.つまり
bp,gnを求める要素の和が負数の順対である最大個数に等しい.
できるだけ多くマッチングする方法は
コード#コード#
import sys
def conditionalCounter(boysOrGirlsPostive,girlsOrBoysnegative):
postive=boysOrGirlsPostive
negative=girlsOrBoysnegative
def counter():
count=0
while postive and negative:
if postive[-1]+negative[-1]<0:
count+=1
postive.pop()
negative.pop()
else:
postive.pop()
return count
return counter
if __name__ == "__main__":
input()
boys=list(map(int,sys.stdin.readline().rstrip().split()))
girls=list(map(int,sys.stdin.readline().rstrip().split()))
boysPostive=sorted([i for i in boys if i>0])
boysNegative=sorted([i for i in boys if i<0],reverse=True)
girlsPostive=sorted([i for i in girls if i>0])
girlsNegative=sorted([i for i in girls if i<0],reverse=True)
bpgn=conditionalCounter(boysPostive,girlsNegative)
gpbn=conditionalCounter(girlsPostive,boysNegative)
print(bpgn()+gpbn())
チップ
関数の戻り値で内部関数を返す関数を高次関数のclosureと呼ぶ.
closureを使用する利点は、不変のパラメータを内部関数に直接バインドし、パラメータの数を減らすことです.
上記の関数ではconditionalCounterがpostiveと負の値を直接選択してバインドするため、不変のパラメータは伝達されないbpgn関数とgpbn関数を作成することができる.
Reference
この問題について([白俊]2831号:舞踏会), 我々は、より多くの情報をここで見つけました https://velog.io/@ha-mulan/백준-2831번-댄스-파티テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol