题目描述
幼儿园一个大班要分成两个小班,有些小朋友不希望自己和其他某几位小朋友同班。
园长向大家收集了不希望同班的要求,然后视情况将一个大班的小朋友分成两个班。
请你开发一个程序,帮助园长快速判断是否所有小朋友的不同班请求都可以被满足。
- 输入描述
输入分为三部分。
第一个部分是一个int,代表这个大班里小朋友的总数。
第二部分是一个int,代表园长采集到的小朋友们的请求数。
第三部分是小朋友们的请求,每个请求由两个int组成。
第一个int代表提请求的小朋友,第二个int代表他不希望同班的另一位小朋友。
- 输出描述
如果所有小朋友的请求都可以被满足,输出 1,否则输出 0。
- 示例1
输入:
5
5
1 2
1 3
1 4
1 5
2 3
输出:
0
- 示例2
输入:
5
4
1 2
1 3
1 4
1 5
输出:
0
找规律
比较冲突的最大值与所空余的位置之间的大小关系。
def divide_into_classes(request):
value, space = 0, 0
for ci in range(len(request[0])):
current = sum(request[ci][:ci])
if current == 0:
space += 1
if current > value:
value = current
if value <= space:
return 1
else:
return 0
if __name__ == '__main__':
child = int(input().strip())
num = int(input().strip())
request = [[0 for _ in range(child)] for _ in range(child)]
for _ in range(num):
[front, rear] = list(map(int, input().strip().split()))
request[front-1][rear-1] = 1
request[rear-1][front-1] = 1
print(divide_into_classes(request))
检测冲突
设置left和right作为两个小班,在进行读取输入值时就进行分班。由于甲希望不与乙同班跟乙不与甲同班是一样的,故可以将一个请求的两个序号进行排序输入,默认情况下是第一个序号、第二个序号分别放在left、right小班里。当且只有第二个序号在right里而第一个序号不在right班级里时,则反着放入。最后依次对孩子序号进行遍历检查冲突。
def divide_into_classes(child, left, right):
for ci in range(1, child+1):
if ci in left and ci in right:
return 0
return 1
if __name__ == '__main__':
child = int(input().strip())
num = int(input().strip())
left, right = set(), set()
for _ in range(num):
values = list(map(int, input().strip().split()))
values.sort()
if values[0] in right and values[1] not in right:
values.reverse()
left.add(values[0])
right.add(values[1])
print(divide_into_classes(child, left, right))
(最近更新:2019年08月28日)