舞會心動男/女生配對問題


今天,在冬木市舉行了一場盛大的舞會。參加舞會的有n 位男士,從 1 到 n 編號;有 m 位女士,從 1 到 m 編號。對於每一位男士,他們心中都有各自心儀的一些女士,在這次舞會中,他們希望能與每一位自己心儀的女士跳一次舞。同樣的,對於每一位女士,她們心中也有各自心儀的一些男士,她們也希望能與每一位自己心儀的男士跳一次舞。在舞會中,對於每一首舞曲,你可以選擇一些男士和女士出來跳舞。但是顯然的,一首舞曲中一位男士只能和一位女士跳舞,一位女士也只能和一位男士跳舞。由於舞會的時間有限,現在你想知道你最少需要准備多少首舞曲,才能使所有人的心願都得到滿足?

https://www.nowcoder.com/practice/9efe02ab547d4a9995fc87a746d7eaec?tpId=0&tqId=0&rp=0&ru=/ta/2018test&qru=/ta/2018test/question-ranking
這道題可以在牛客上面做

因為同一首歌內,男生/女生只能接受一個邀約,所以最多需要多少首歌,就取決於最受歡迎的那個男/女生被多少人翻牌子。我們用一個二維矩陣\(D=(d_{i,j})\)記錄,我們需要配對的男、女生。\(d_{i,j}=1\)表示我們需要將第\(i\)號男生和第\(j\)號女生進行配對,至於誰是誰的心動男/女生,我們管不着;\(d_{i,j}=0\)表示他們互不心動,但也不代表他們不會被配對上,有人跳舞總好過沒有嘛。通過輸入修改二維矩陣元素后,我們看第\(i\)行,1的個數\(c_i\)就是第i號男生受歡迎的程度,我們共需要\(c_i\)首歌才可以滿足這個需求。所以我們按行、按列相加之后,就可以知道每個男生、女生的受歡迎程度。最終需要多少首歌,就取決於最受歡迎的那個人有多少個配對需求啦。

line = raw_input().split()
n, m = map(int, line)
like = [[0 for i in range(n)] for i in range(m)]
for i in range(n):
    line = map(int, raw_input().split())
    for j in range(1, line[0] + 1):
        like[line[j]-1][i] = 1
for i in range(m):
    line = map(int, raw_input().split())
    for j in range(1, line[0] + 1):
        like[i][line[j]-1] = 1
res1 = [0 for i in range(n)]
res2 = [0 for i in range(m)]
for i in range(n):
    for j in range(m):
        res1[i] += like[j][i]
for i in range(m):
    for j in range(n):
        res2[i] += like[i][j]
print max(res1 + res2)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM