编程题练习@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)

题目2:

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

输入
第一行为候选基站的坐标点个数n (0<n<10000),后面的每一行都表示候选基站的行列位置,格式为:行位置+空格+列位置
输出
格式为:建造的基站个数+空格+覆盖的地域面积

样例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)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值