博客
关于我
NYOJ325 zb的生日(01背包,深搜DFS) NYOJ27 水池数目(深搜DFS) 简单题目【代码未经评测】
阅读量:765 次
发布时间:2019-03-23

本文共 2540 字,大约阅读时间需要 8 分钟。

题目防止横向.script的执行,慎重处理

问题一:分组西瓜

要给两个好友分西瓜,使两堆的质量差最小。每个西瓜的重量已知。

思路:使用动态规划求所有可能的子集和,找出最接近总重量的一半的那个和,两堆差值最小。

解决方案代码:

def min_difference():    import sys    input = sys.stdin.read().split()    ptr = 0    N = int(input[ptr])    ptr += 1    w = [int(input[ptr + i]) for i in range(N)]    sum_all = sum(w)    target = sum_all // 2    max_mask = 1 << N    dp = [float('inf')] * (max_mask)    dp[0] = 0    for mask in range(max_mask):        if dp[mask] == float('inf'):            continue        s = dp[mask]        for i in range(N):            if not (mask & (1 << i)):                new_mask = mask | (1 << i)                new_s = s + w[i]                diff = abs(sum_all - 2 * new_s)                if diff < dp[new_mask]:                    dp[new_mask] = diff    min_diff = min(dp)    print(min_diff)min_difference()

解释:

  • 读取输入并处理数据: 读取西瓜数量和每个西瓜的重量。
  • 计算总重量: 计算总重量,并计算目标值,即两堆应尽量接近的重量。
  • 动态规划数组初始化: 使用位mask表示子集,dp[mask]记录对应子集的重量。
  • 遍历所有子集: 对每个子集,扩展并更新可能的子集和。
  • 记录最小差值: 遍历所有可能的子集,找出使得两堆重量差最小的值,并输出结果。
  • 问题二:水池计数

    在二维地图中,计算连通的水池数量。每个水池周围的4个方向相邻的水池属于同一池。

    思路:使用BFS或DFS遍历每个地图中的水池,标记已访问的水池,统计不同连通区域的数量。

    解决方案代码:

    import sysfrom collections import dequedef count_water_pools():    input = sys.stdin.read().split()    ptr = 0    T = int(input[ptr])    ptr += 1    for _ in range(T):        m = int(input[ptr])        n = int(input[ptr + 1])        ptr +=2        grid = []        for i in range(m):            row = list(map(int, input[ptr:ptr+n]))            ptr +=n            grid.append(row)                visited = [ [False for _ in range(n)] for __ in range(m)]        count = 0                for i in range(m):            for j in range(n):                if grid[i][j] == 1 and not visited[i][j]:                    count +=1                    # BFS                    q = deque()                    q.append( (i,j) )                    visited[i][j] = True                    while q:                        x, y = q.popleft()                        for dx, dy in [ (-1,0), (1,0), (0,-1), (0,1) ]:                            nx = x + dx                            ny = y + dy                            if 0 <= nx < m and 0 <= ny < n:                                if grid[nx][ny] ==1 and not visited[nx][ny]:                                    visited[nx][ny] = True                                    q.append( (nx, ny) )        print(count)count_water_pools()

    解释:

  • 读取输入处理数据: 解析多组测试用例,读取地图数据。
  • 初始化结构: 创建一个标记已访问的矩阵,初始化计数器。
  • 遍历地图: 对于每个未被访问的水池(1),启动BFS,标记所有相连的水池为已访问。
  • 计数连通水池: 每次启动BFS时,计数加一。
  • 输出结果: 输出所有测试用例的水池数量。
  • 这两个问题通过动态规划和图遍历分别解决,分别找到最优的分组方式和连通的水池数量。

    转载地址:http://pugzk.baihongyu.com/

    你可能感兴趣的文章
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    mysql replace用法
    查看>>
    Mysql Row_Format 参数讲解
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>
    MySQL Server 5.5安装记录
    查看>>
    mysql server has gone away
    查看>>
    mysql slave 停了_slave 停止。求解决方法
    查看>>