L2-4 秀恩爱分得快(python实现)

#encoding=utf-8
def binary_serch(nums, target):
    i = 0
    j = len(nums) - 1
    m = -1
    while i <= j:
        m = (i + j) // 2
        if target == nums[m]:
            return m
        elif target > m:
            i = m + 1
        else:
            j = m - 1

#变量的声明
flag_A=0
flag_B=0
# 控制输入
N, M = map(eval, input().split())

# 准备一个照片集p
p = []
for i in range(M):
    p.append(list(map(eval, input().split())))
A, B = map(eval, input().split())
# 判断A,B的正负性(应该没有gay吧.....)
if A > 0:
    judge_A = 1
    judge_B = 0
else:
    judge_A = 0
    judge_B = 1

# 建立A,B的hash字典(为了方便起见(我是直接对着例子进行分析的,所以我命名的规则就是按照给的实例一命名的))
hashmap_A = dict()
hashmap_B = dict()
# 循环遍历照片集p
for i in p:
    # 首先要对i进行排序(从小到大或者从大到小应该没那么严格的要求),排完序之后再进行二分查找
    # n表示i照片的第一个元素——也就是照片中的人数(pop出来再排序懂得都懂)
    n = i.pop(0)
    sorted(i, reverse = True)

    # 二分查找i中是否有A,B,因为我们最后需要判断的A,B相对应的关系,所以这样可以减少无关数据的判断
    # 用m_A来记录找到的A的下标 用m_B来记录找到的B的下标
    m_A = binary_serch(i, A)
    m_B = binary_serch(i, B)

    # 如果m_A和m_B的值不为none也就是找到了那么就弹出A和B
    if m_A != None:
        i.pop(m_A)
        flag_A=1
    # 否则我们就可以不用查找关于A的异性了(A都没在里面,当然对于A来说这张照片中其他人就是无效数据了)
    if m_B != None:
        i.pop(m_B)
        flag_B=1
    # 然后开始查找i中相应的负数和正数对应的添加到A,B的hash字典中去
    for k in i:
        # 如果A在i里面而且 A是正数的话,那我们就去i中找负数,而且找到的负数添加到A的hash字典中去
        if flag_A and judge_A>0:
            if k < 0:
                hashmap_A[k] = hashmap_A.get(k, 0) + 1 / n
        if flag_B and judge_B>0:
            if k < 0:
                hashmap_B[k] = hashmap_A.get(k, 0) + 1 / n
        if flag_A and  judge_A<0:
            if k > 0:
                hashmap_A[k] = hashmap_B.get(k, 0) + 1 / n
        if flag_B and  judge_B<0:
            if k > 0:
                hashmap_B[k] = hashmap_B.get(k, 0) + 1 / n
# 然后开始查找两个hashmap中的max
# 首先进行排序
l_hashmap_A = list(hashmap_A.items())
s_l_A = sorted(l_hashmap_A, key=lambda x: x[1], reverse=True)
# 然后返回排序后的第一个值也就是max
max_l_A = s_l_A[0][1]
l_hashmap_B = list(hashmap_B.items())
s_l_B = sorted(l_hashmap_B, key=lambda x: x[1], reverse=True)
max_l_B = s_l_B[0][1]

# 然后到两个字典里面去找max对应的key并分别返回一个最大值列表,
# 如果A,B同时都是二者最大值列表中的值,输出一行就可以了
# 如果并没有那么就分别输出就可以了
maxlistA = []
maxlistB = []
for i in hashmap_A.items():
    if i[1] == max_l_A:
        maxlistA.append(i[0])
for i in hashmap_B.items():
    if i[1] == max_l_B:
        maxlistB.append(i[0])

#然后二分查找两个最亲密关系中是不是有对方
A_beleave=binary_serch(maxlistA,B)
B_beleave=binary_serch(maxlistB,A)
if A_beleave is not None and B_beleave is not None:
    print("{} {}".format(A, B))
# 按照绝对值从小到大输出
else:
    maxlistA2 = sorted(maxlistA, key=abs, reverse=True)
    maxlistB2 = sorted(maxlistA, key=abs, reverse=True)
    for i in maxlistA2:
        print("{} {}".format(A, i))
    for i in maxlistB2:
        print("{} {}".format(B, i))

无语。。。。。。

这个报错不知道怎么了,我明明没有改这行代码,原来逻辑有误的代码如下:都没报这个错误

#encoding=utf-8
def binary_serch(nums, target):
    i = 0
    j = len(nums) - 1
    m = -1
    while i <= j:
        m = (i + j) // 2
        if target == nums[m]:
            return m
        elif target > m:
            i = m + 1
        else:
            j = m - 1


# 控制输入
N, M = map(eval, input().split())

# 准备一个照片集p
p = []
for i in range(M):
    p.append(list(map(eval, input().split())))
A, B = map(eval, input().split())
flag_A=0
flag_B=0
# 判断A,B的正负性(应该没有gay吧.....)
if A > 0:
    judge_A = 1
    judge_B = 0
else:
    judge_A = 0
    judge_B = 1

# 建立A,B的hash字典(为了方便起见(我是直接对着例子进行分析的,所以我命名的规则就是按照给的实例一命名的))
hashmap_A = dict()
hashmap_B = dict()
# 循环遍历照片集p
for i in p:
    # 首先要对i进行排序(从小到大或者从大到小应该没那么严格的要求),排完序之后再进行二分查找
    # n表示i照片的第一个元素——也就是照片中的人数(pop出来再排序懂得都懂)
    n = i.pop(0)
    sorted(i, reverse = True)

    # 二分查找i中是否有A,B,因为我们最后需要判断的A,B相对应的关系,所以这样可以减少无关数据的判断
    # 用m_A来记录找到的A的下标 用m_B来记录找到的B的下标
    m_A = binary_serch(i, A)
    m_B = binary_serch(i, B)

    # 如果m_A和m_B的值不为none也就是找到了那么就弹出A和B
    if m_A != None:
        i.pop(m_A)
        flag_A=1
    # 否则我们就可以不用查找关于A的异性了(A都没在里面,当然对于A来说这张照片中其他人就是无效数据了)
    if m_B != None:
        i.pop(m_B)
        flag_B=1
    # 然后开始查找i中相应的负数和正数对应的添加到A,B的hash字典中去
    for k in i:
        # 如果A在i里面而且 A是正数的话,那我们就去i中找负数,而且找到的负数添加到A的hash字典中去
        if flag_A and judge_A:
            if k < 0:
                hashmap_A[k] = hashmap_A.get(k, 0) + 1 / n
        if flag_B and judge_B:
            if k < 0:
                hashmap_B[k] = hashmap_A.get(k, 0) + 1 / n
        if flag_A and not judge_A:
            if k > 0:
                hashmap_A[k] = hashmap_B.get(k, 0) + 1 / n
        if flag_B and not judge_B:
            if k > 0:
                hashmap_B[k] = hashmap_B.get(k, 0) + 1 / n
# 然后开始查找两个hashmap中的max
# 首先进行排序
l_hashmap_A = list(hashmap_A.items())
s_l_A = sorted(l_hashmap_A, key=lambda x: x[1], reverse=True)
# 然后返回排序后的第一个值也就是max
max_l_A = s_l_A[0][1]
l_hashmap_B = list(hashmap_B.items())
s_l_B = sorted(l_hashmap_B, key=lambda x: x[1], reverse=True)
max_l_B = s_l_B[0][1]

# 然后到两个字典里面去找max对应的key并分别返回一个最大值列表,
# 如果A,B同时都是二者最大值列表中的值,输出一行就可以了
# 如果并没有那么就分别输出就可以了
maxlistA = []
maxlistB = []
for i in hashmap_A.items():
    if i[1] == max_l_A:
        maxlistA.append(i[0])
    if i[1] == max_l_B:
        kuzi_A = 1
for i in hashmap_B.items():
    if i[1] == max_l_B:
        maxlistB.append(i[0])
    if i[1] == max_l_A:
        kuzi_B = 1
if kuzi_A and kuzi_B:
    print("{} {}".format(A, B))
# 按照绝对值从小到大输出
else:
    maxlistA2 = sorted(maxlistA, key=abs, reverse=True)
    maxlistB2 = sorted(maxlistA, key=abs, reverse=True)
    for i in maxlistA2:
        print("{} {}".format(A, i))
    for i in maxlistB2:
        print("{} {}".format(B, i))

 

 换了种找字典中最大值的方法:还是错。。。。。。

#encoding=utf-8
def binary_serch(nums, target):
    i = 0
    j = len(nums) - 1
    m = -1
    while i <= j:
        m = (i + j) // 2
        if target == nums[m]:
            return m
        elif target > m:
            i = m + 1
        else:
            j = m - 1

#变量的声明
flag_A=False
flag_B=False
# 控制输入
N, M = map(eval, input().split())

# 准备一个照片集p
p = []
for i in range(M):
    p.append(list(map(eval, input().split())))
A, B = map(eval, input().split())
# 判断A,B的正负性(应该没有gay吧.....)
if A > 0:
    judge_A = 1
    judge_B = 0
else:
    judge_A = 0
    judge_B = 1

# 建立A,B的hash字典(为了方便起见(我是直接对着例子进行分析的,所以我命名的规则就是按照给的实例一命名的))
hashmap_A = dict()
hashmap_B = dict()
# 循环遍历照片集p
for i in p:
    # 首先要对i进行排序(从小到大或者从大到小应该没那么严格的要求),排完序之后再进行二分查找
    # n表示i照片的第一个元素——也就是照片中的人数(pop出来再排序懂得都懂)
    n = i.pop(0)
    sorted(i, reverse = True)

    # 二分查找i中是否有A,B,因为我们最后需要判断的A,B相对应的关系,所以这样可以减少无关数据的判断
    # 用m_A来记录找到的A的下标 用m_B来记录找到的B的下标
    m_A = binary_serch(i, A)
    m_B = binary_serch(i, B)

    # 如果m_A和m_B的值不为none也就是找到了那么就弹出A和B
    if m_A != None:
        i.pop(m_A)
        flag_A=True
    # 否则我们就可以不用查找关于A的异性了(A都没在里面,当然对于A来说这张照片中其他人就是无效数据了)
    if m_B != None:
        i.pop(m_B)
        flag_B=True
    # 然后开始查找i中相应的负数和正数对应的添加到A,B的hash字典中去
    for k in i:
        # 如果A在i里面而且 A是正数的话,那我们就去i中找负数,而且找到的负数添加到A的hash字典中去
        if flag_A and judge_A>0:
            if k < 0:
                hashmap_A[k] = hashmap_A.get(k, 0) + 1/n
        if flag_B and judge_B>0:
            if k < 0:
                hashmap_B[k] = hashmap_A.get(k, 0) + 1/n
        if flag_A and  judge_A<0:
            if k > 0:
                hashmap_A[k] = hashmap_B.get(k, 0) + 1/n
        if flag_B and  judge_B<0:
            if k > 0:
                hashmap_B[k] = hashmap_B.get(k, 0) + 1/n
# 然后开始查找两个hashmap中的max
# 首先进行排序
l_hashmap_A = list(hashmap_A.items())
#s_l_A = sorted(l_hashmap_A, key=lambda x: x[1], reverse=True)
# 然后返回排序后的第一个值也就是max
#max_l_A = s_l_A[0][1]
s_l_A = sorted(zip(hashmap_A.values(),hashmap_A.keys()))
max_l_A=max(s_l_A)[1]
l_hashmap_B = list(hashmap_B.items())
#s_l_B = sorted(l_hashmap_B, key=lambda x: x[1], reverse=True)
#max_l_B = s_l_B[0][1]
s_l_B = sorted(zip(hashmap_B.values(),hashmap_B.keys()))
max_l_B=max(s_l_B)[1]



# 然后到两个字典里面去找max对应的key并分别返回一个最大值列表,
# 如果A,B同时都是二者最大值列表中的值,输出一行就可以了
# 如果并没有那么就分别输出就可以了
maxlistA = []
maxlistB = []
for i in hashmap_A.items():
    if i[1] == max_l_A:
        maxlistA.append(i[0])
for i in hashmap_B.items():
    if i[1] == max_l_B:
        maxlistB.append(i[0])

#然后二分查找两个最亲密关系中是不是有对方
A_beleave=binary_serch(maxlistA,B)
B_beleave=binary_serch(maxlistB,A)
if A_beleave != None and B_beleave != None:
    print("{} {}".format(A, B))
# 按照绝对值从小到大输出
else:
    maxlistA2 = sorted(maxlistA, key=abs, reverse=True)
    maxlistB2 = sorted(maxlistA, key=abs, reverse=True)
    for i in maxlistA2:
        print("{} {}".format(A, i))
    for i in maxlistB2:
        print("{} {}".format(B, i))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值