美文网首页
pdd2020-09-01

pdd2020-09-01

作者: 9_SooHyun | 来源:发表于2020-09-01 22:20 被阅读0次

给一个m*n的矩阵,矩阵由0和1组成,1表示一个士兵,相连(上下左右视为相连)的士兵组成一个团队,现在可以移动一个已有士兵到任何位置,求一个团队最多能有多少个士兵

个人思路:

  • 1.首先统计所有1的数量one_count,发现矩阵全部是1,直接返回矩阵size;全部是0,返回0
  • 2.否则说明有士兵,也有空位可以供士兵移动。对每一个0,可以尝试把一个1换到这个位置,dfs搜索该区域,更新ans
  • 3.如果最终ans比所有1的数量one_count还多1,说明填充的1是凭空填充的,填充后原来所有的1会联通。这时直接返回step1中统计的1的数量one_count,否则返回ans

结果:部分超时
原因分析:对于不同的0,可能连接了同一区域内不同位置的1,从而对同一区域进行了多次dfs搜索,产生了重复计算

代码如下:

import sys 
content = list(sys.stdin)
matrix = []
content_size = len(content)
for i in range(1, content_size):
    matrix.append(content[i].strip().split())

# 主函数
def func(matrix):
    r = len(matrix)
    c = len(matrix[0])
    res = 0
    one_count = 0
    for i in range(r):
        for j in range(c):
            if matrix[i][j] == '1':
                one_count += 1
    # 如果全是1,直接返回
    if one_count == r*c:
        return r*c
    if one_count == 0:
        return 0
    
    # 如果存在0和1
    for i in range(r):
        for j in range(c):
            if matrix[i][j] == '0':
                visited_pos = set()
                visited_pos.add((i,j))
                dfs(matrix, i, j, visited_pos)
                res = max(res, len(visited_pos))
    # 如果res比所有1的数量还多1,说明填充的1是凭空填充的,填充后原来所有的1会联通
    if res == one_count + 1:
        return one_count
    return res 

def dfs(matrix, i, j, visited_pos):
    for p, q in getNei(matrix, i, j):
        if matrix[p][q] == '1':
            if (p, q) not in visited_pos:
                visited_pos.add((p,q))
                dfs(matrix, p, q, visited_pos)
    
def getNei(matrix, i, j):
    r = len(matrix)
    c = len(matrix[0])
    for p, q in [1,0],[-1,0],[0,1],[0,-1]:
        if 0 <= i + p < r and 0 <= j + q < c:
            yield i + p, q +j
            
print(func(matrix))

借鉴别人的思路,

  • 1.先dfs/bfs搜索矩阵每一块士兵区域,编号并记录大小。这样每个区域只需计算一次
  • 2.找到0,如果周围有2块区域且仍有其他区域,那么可以从任一其他区域拿一个1换到当前的0位置,更新ans
  • 3.如果周围只有2块区域,那么可以从任一区域拿一个1换到当前的0位置,更新ans为区域总和

给一个n(n<=1e9)和m(m<=10)个数,一个数能被这m个数中的某个数整除的数被称为好数,求[1,n]中有多少个好数

输入
10 2
2
3
返回 7

说明
n=10, m=2, 对应2和3
10内被2整除的2,4,6,8,10;被3整除的3,6,9。合并后共7个

import sys 
content = list(sys.stdin)
feature = []
content_size = len(content)
num = int(content[0].strip().split()[0])
for i in range(1, content_size):
    feature.append(int(content[i].strip()))

# 用数组模拟32位的bitmap,一个int为32位,可以用来表示32个数,如在首个int中,000...0001表示32,1000...000表示1
bit32_map = [0 for i in range(num//32+1)]
for i in range(len(feature)):
    ele = feature[i]
    k = 1
    t = ele*k
    while t <= num:
        # 求出t对应的索引
        index = (t+32) // 32 - 1
        # 或运算
        bit32_map[index] = bit32_map[index] | (1 << (32-t%32)%32)
        k += 1
        t = ele*k
ans = 0
for ele in bit32_map:
    while ele:
        if ele & 1:
            ans += 1
        ele = ele >> 1
print(ans)

相关文章

  • pdd2020-09-01

    给一个m*n的矩阵,矩阵由0和1组成,1表示一个士兵,相连(上下左右视为相连)的士兵组成一个团队,现在可以移动一个...

网友评论

      本文标题:pdd2020-09-01

      本文链接:https://www.haomeiwen.com/subject/ezpbsktx.html