• 编程题练习@9-13


    题目一:

    互通设备集
    题目描述:
    同一局域网内的设备可以相互发现,具备直连路由的两个设备可以互通。假定设备A和B互通,B和C互通,那么可以将B作为中心设备,通过多跳路由策略使设备A和C互通。这样,A、B、C三个设备就组成了一个互通设备集。其中,互通设备集包括以下几种情况:
    1)直接互通的多个设备
    2)通过多跳路由策略间接互通的多个设备
    3)没有任何互通关系的单个设备
    现给出某一局域网内的设备总数以及具备直接互通关系的设备,请计算该局域网内的互通设备集有多少个?

    样例1
    输入
    3
    2
    0 1
    0 2
    输出
    1

    样例2
    输入
    2
    0
    输出
    2

    样例3
    输入
    5
    2
    0 1
    2 3
    输出
    3

    代码如下:

    m = int(input())
    n = int(input())
    edges = []
    for _ in range(n):
        edges.append(tuple(map(int, input().split())))
    
    # 深搜
    def dfs(graph, start, visited):
        visited[start] = True
        for neighbor in graph[start]:
            if not visited[neighbor]:
                dfs(graph, neighbor, visited)
    
    # 创建邻接表
    def create_graph(m, edges):
        graph = [[] for _ in range(m)]
        for edge in edges:
            graph[edge[0]].append(edge[1])
            graph[edge[1]].append(edge[0])
        return graph
    
    # 记录连通分量数
    def dfs_graph(m, edges):
        graph = create_graph(m, edges)
        cnt = 0
        visited = [False] * m
        for i in range(m):
            if not visited[i]:
                dfs(graph, i, visited)
                cnt += 1
        print(cnt)
    
    dfs_graph(m, edges)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    题目2:

    基站建设
    题目描述
    运营商建设基站时需要关注很多因素,其中:基站的信号覆盖范围、建设成本就是要考虑的部分因素。
    以一个二维数组(1000010000)表示需要服务的有效地域范围,假设个基站坐标为(2,2),可覆盖的范围为基站为中心的33的矩阵(若不在有效地域范围则无效)。
    现有多个基站候选点,我们需要决策在哪些地点建设基站,要求:在尽可能多地覆盖服务地域的前提下尽可能少地建设基站。

    输入
    第一行为候选基站的坐标点个数n (0 输出
    格式为:建造的基站个数+空格+覆盖的地域面积

    样例1
    输入
    4
    2 2
    5 5
    5 4
    5 3
    输出
    3 24
    解释
    最佳的策略为选择(2,2)、(5,5)、(5,3)这三个基站候选点,他们的覆盖面积为24

    代码如下:

    # 计算基站覆盖面积
    def calculate_coverage(candidate_sites):
        used = set() 
        covered_area = 0
        for site in candidate_sites:
            row, col = site
            for i in range(row-1, row+2):
                for j in range(col-1, col+2):
                    if (i >= 0 and i < 10000 and j >= 0 and j < 10000):
                        if (i, j) not in used:
                            used.add((i, j))
                            covered_area += 1
        return covered_area
    
    # 逐个减去基站计算面积
    def choose_sites(candidate_sites, covered_area):
        for site in candidate_sites:
            temp_sites = candidate_sites.copy()
            temp_sites.remove(site)  # 逐个减去一个候选基站
            temp_covered_area = calculate_coverage(temp_sites)
            if temp_covered_area == covered_area:
                candidate_sites = temp_sites  # 更新选择的基站列表
        return candidate_sites
    
    # 从输入读取候选基站信息
    n = int(input())
    candidate_sites = set()  # 使用集合来避免重复的基站坐标
    
    for _ in range(n):
        x, y = map(int, input().split())
        candidate_sites.add((x, y))
    
    # 初始时选择所有候选基站并计算覆盖面积
    covered_area = calculate_coverage(candidate_sites)
    
    # 选择基站并计算覆盖面积
    chosen_sites = choose_sites(candidate_sites, covered_area)
    final_covered_area = calculate_coverage(chosen_sites)
    
    # 输出结果
    print(len(chosen_sites), final_covered_area)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    面试那些题(1)
    【玩转腾讯云】使用轻量应用服务器和calibre-web搭建个人在线图书馆
    Django知识
    面试题-谈谈你对JVM的理解
    Python3
    python经典百题之八进制转十进制
    线上 udp 客户端请求服务端客户端句柄泄漏问题
    酷开会员丨酷开系统让居家K歌变得更简单!
    面试必杀技:Jmeter性能测试攻略大全(第一弹)
    【Memcached】Memcached的工作原理
  • 原文地址:https://blog.csdn.net/cjw838982809/article/details/132864124