题解 | #素数伴侣#给个不一样的解法:建图+贪心

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

将可以组成 素数伴侣 的一对数字 看成 相连的两个节点,建一个无向图,并统计每个节点的

每次从节点中选择 度 最小 的节点,再选择与它相连的 度 最小的节点。之后将他们从图中删除

import math

n = int(input())
nums = list(map(int, input().split()))

def isPrime(x):
    if x == 2:
        return True
    for d in range(2, int(math.sqrt(x))+1):
        if x%d == 0:
            return False
    return True

# 能组成一对素数伴侣的下标,建立成无向图
G = [set() for _ in range(n)]
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if isPrime(nums[i]+nums[j]):
            G[i].add(j)
            G[j].add(i)

# 统计节点的度
degrees = [len(G[i]) for i in range(n)]
res = 0
def deleteNode(x):
    # 从图中删除节点
    degrees[x] = 0
    for y in G[x]:
        G[y].discard(x)
        degrees[y] -= 1
    G[x].clear()

while True:

    # 找到度最小的节点
    minn = 1000000000
    x = -1
    for i in range(n):
        if degrees[i] > 0:
            if degrees[i] < minn:
                minn = degrees[i]
                x = i
    if x == -1:
        break
    minn = 1000000000
    y = -1
    
    # 从找到节点的邻接节点中再找一个度最小的节点
    for i in G[x]:
        if degrees[i] > 0:
            if degrees[i] < minn:
                minn = degrees[i]
                y = i
    if y == -1:
        break
    # 删除这两个节点
    deleteNode(x)
    deleteNode(y)
    res += 1
print(res)

全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务