首页 > 试题广场 >

舞会

[编程题]舞会
  • 热度指数:1478 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

今天,在冬木市举行了一场盛大的舞会。参加舞会的有n 位男士,从 1 到 n 编号;有 m 位女士,从 1 到 m 编号。对于每一位男士,他们心中都有各自心仪的一些女士,在这次舞会中,他们希望能与每一位自己心仪的女士跳一次舞。同样的,对于每一位女士,她们心中也有各自心仪的一些男士,她们也希望能与每一位自己心仪的男士跳一次舞。在舞会中,对于每一首舞曲,你可以选择一些男士和女士出来跳舞。但是显然的,一首舞曲中一位男士只能和一位女士跳舞,一位女士也只能和一位男士跳舞。由于舞会的时间有限,现在你想知道你最少需要准备多少首舞曲,才能使所有人的心愿都得到满足?


输入描述:
第一行包含两个整数n,m,表示男士和女士的人数。1≤n,m≤ 1000
接下来n行,
第i行表示编号为i的男士有ki个心仪的女生
然后包含ki个不同的整数分别表示他心仪的女士的编号。
接下来m行,以相同的格式描述每一位女士心仪的男士。


输出描述:
一个整数,表示最少需要准备的舞曲数目。
示例1

输入

2 3
1 1
2 2 3
0
0
0

输出

2
示例2

输入

3 3
2 1 2
2 1 3
2 2 3
1 1
2 1 3
2 2 3

输出

2

说明

对于样例2,我们只需要两首舞曲,第一首舞曲安排(1,1),(2,3),(3,2);第二首舞曲安排(1,2),(2,1),(3,3)。
n, m = map(int, input().split())
heartbeat = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in list(map(int, input().split()))[1:]:
        if not heartbeat[i][j]:
            heartbeat[i][j] = 1
            heartbeat[i][0] += 1
            heartbeat[0][j] += 1
for i in range(1, m + 1):
    for j in list(map(int, input().split()))[1:]:
        if not heartbeat[j][i]:
            heartbeat[j][i] = 1
            heartbeat[j][0] += 1
            heartbeat[0][i] += 1
print(max(max(heartbeat[0]), max(heartbeat[0][j] for j in range(1, n + 1))))
编辑于 2019-03-26 23:49:23 回复(0)
比较暴力啊,就是求解A方的心仪对象B的心仪对象的人数,然后取其中最大值。
n,m=list(map(int, input().split(" ")))
fe,ma=[],[]
for i in range(n):
    ma.append(list(map(int, input().split(" "))))
for i in range(m):
    fe.append(list(map(int, input().split(" "))))
s=[]
for i in range(len(fe)):
    if fe[i][0]==0:
        s.append(0)
    else:
        smax = 0
        for j in fe[i][1:]:
            smax = max(smax,ma[j-1][0])
        s.append(smax)
for i in range(len(ma)):
    if ma[i][0]==0:
        s.append(0)
    else:
        smax = 0
        for j in ma[i][1:]:
            smax = max(smax,fe[j-1][0])
        s.append(smax)    
print (max(s))
发表于 2019-03-24 21:34:40 回复(0)

问题信息

上传者:小小
难度:
2条回答 7157浏览

热门推荐

通过挑战的用户

查看代码