小红书:幼儿园分班(Python语言实现)

题目描述

幼儿园一个大班要分成两个小班,有些小朋友不希望自己和其他某几位小朋友同班。
园长向大家收集了不希望同班的要求,然后视情况将一个大班的小朋友分成两个班。
请你开发一个程序,帮助园长快速判断是否所有小朋友的不同班请求都可以被满足。
  • 输入描述
输入分为三部分。
    第一个部分是一个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日)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值