当前位置: 首页 > article >正文

【Atcoder】【ABC383】B.Humidifier2题解

题目传送门:B - Humidifier 2

题目大意

给定H * W的矩阵和D,每个字符可能是 '#' 或 ‘ . ’(分别表示墙和空地)

要求选出两个空地放置加湿器,

与加湿器的曼哈顿距离(dis(P_1(x_1,y_1),P_2(x_2,y_2)) = |x_1-x_2| + |y_1 - y_2|)

不大于D的空格可以被加湿

求最多有几个空地可以被加湿

(保证至少有两个空地)

思路

还是首先看到数据范围

H,W都很小,于是我们就可以尝试这样一个方法:

枚举两个加湿器的位置。对于每个加湿器,判断每个格子能否被加湿

为了方便计算,可以先定义计算两点之间曼哈顿距离的函数:

int dis(int x1, int x2, int y1, int y2){
    return abs(x1-x2) + abs(y1-y2);
}

另外需要注意,对于两个加湿器不能分别计算,因为可能有重合

我这里的方法是直接开一个数组vis来记录的……

程序框架部分就不用多说了,直接上代码:

AC代码

#include<iostream>
#include<cstring>
using namespace std;
#define For(i, j, k) for(int i = j; i <= k; i++)
#define MaxN 15

int n, m, D, ans;
int vis[MaxN][MaxN];
char a[MaxN][MaxN];

int dis(int x1, int y1, int x2, int y2){    //计算曼哈顿距离
    return abs(x1 - x2) + abs(y1 - y2);
}

void count(int i, int j){        //统计哪几个点能被加湿
    For(i2, 1, n){
        For(j2, 1, m){
            if(a[i2][j2] == '.' && dis(i, j, i2, j2) <= D){
                vis[i2][j2] = 1;
            }
        }
    }
    
}

int main()
{
    cin >> n >> m >> D;
    For(i, 1, n){
        For(j, 1, m){
            cin >> a[i][j];
        }
    }
    For(i, 1, n){
        For(j, 1, m){
            For(i2, 1, n){
                For(j2, 1, m){
                    if(a[i][j] == '.' && a[i2][j2] == '.' && !(i == i2 && j == j2)){
                        memset(vis, 0, sizeof(vis));
                        count(i, j); count(i2, j2);        //分别统计
                        int cnt = 0;            //一共能加湿的空格数
                        For(k, 1, n){
                            For(l, 1, m){
                                if(vis[k][l]) cnt++;
                            }
                        }
                        ans = max(ans, cnt);        //答案在所有方案中取最大值
                    }
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}

总结

也是比较基础的一题,没什么好说的

上述代码时间复杂度O(N^3M^3),怎么说呢

六重循环有点丑,大家也可以想想怎么优化

最后,内容创作不易,如果你喜欢就请点个收藏点个赞

我的主页里也有更多竞赛真题,感谢大家的支持!


http://www.kler.cn/a/428369.html

相关文章:

  • Class1(2020):Shell基础(一)——Shell概念
  • 【2024年华为OD机试】 (C卷,200分)- 字符串拼接(JavaScriptJava PythonC/C++)
  • 在 CentOS 7.9 上编译 Nginx 并启用 SSL 模块时遇到缺少 OpenSSL 源码的编译问题及解决方案
  • QT:QTabWidget设置tabPosition为West时,文字向上
  • Java 8 实战 书籍知识点散记
  • 数据结构与算法之递归: LeetCode 131. 分割回文串 (Ts 版)
  • 使用Docker容器化部署Django项目:从零开始的最佳实践指南
  • Istio Ambient 模式中的透明流量拦截过程详解
  • Ubuntu中安装配置交叉编译工具并进行测试
  • Flink如何基于数据版本使用最新离线数据
  • Python 中的属性访问器是什么?如何使用 @property 装饰器?
  • 数据库原理实验实验四 统计查询和组合查询
  • windows安装使用conda
  • learn-(Uni-app)跨平台应用的框架
  • 2024-10-13-B fd 重定向 缓冲区
  • 链式设计及设计模式的应用
  • application.yml 和 bootstrap.yml
  • 坚果投影仪J10如何用苹果Siri开关机并和米家联动
  • 一、Origin绘制柱状图
  • 23种设计模式之解释器模式
  • 【PlantUML系列】状态图(六)
  • 2-2-18-14 QNX系统架构之 TCP/IP 网络
  • 保护数字资产:iOS 加固在当前安全环境中的重要性
  • ChatGPT Pro是什么
  • 【机器人】系统辨识之激励轨迹设计(傅里叶级数)
  • 原生微信小程序使用原子化tailwindcss