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

这篇文章描述了一个Python程序,该程序处理输入的照片集合,通过二分查找法寻找特定数值,并使用哈希表存储正负数的对应关系。程序会找出每张照片中与指定正负数最常出现的伴侣,并分析两者之间的关系。如果找到一对具有最高亲密关系的数,直接输出,否则按绝对值大小输出其他可能的组合。
摘要由CSDN通过智能技术生成
#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))

引用中提到,通过分析照片可以分析人与人之间的亲密度,而亲密度的计算方式是根据每张照片出现的人数来定义的。根据题目描述,我们需要分析一对给定的情侣是否有亲密度更高的异性朋友。 首先,我们需要根据输入的照片信息,计算出每对人之间的亲密度。根据给定的照片的人数K和这些人的编号P ~ P[K,我们可以计算出K个人两两间的亲密度。如果两个人同时出现在某张照片里,则他们之间的亲密度为1/K。而如果两个人同时出现在多张照片里,他们之间的亲密度就是这些照片对应的亲密度之和。 接下来,我们需要判断给定的情侣是否有亲密度更高的异性朋友。根据题目描述,我们需要找到与给定情侣亲密度更高的异性朋友。如果找到了这样的朋友,我们需要输出他们的编号;如果没有找到,则只需要输出给定情侣的编号。 综上所述,我们可以按照以下步骤解决该问题: 1. 根据输入的照片信息计算每对人之间的亲密度。 2. 判断给定情侣是否有亲密度更高的异性朋友。 3. 如果找到了亲密度更高的异性朋友,输出他们的编号;如果没有找到,则只输出给定情侣的编号。 希望我的回答能够帮助到你解决这个问题。如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [L2-028 秀恩爱分得快(测试点3说明)](https://blog.csdn.net/daybreak_alonely/article/details/127419768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值