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

算法题(130):激光炸弹

审题:

本题需要我们找出激光炸弹所能炸毁的最大价值并打印

思路:
方法一:二维前缀和

炸弹缺陷分析:题目中说目标若位于炸弹的边上就不能炸毁目标,其实是要求我们的炸弹必须完全包围目标方可炸毁

图示的阴影区域是m为1的激光炸弹,如果我们如图摆放炸弹,那么将没有目标被炸毁,因为没有一个目标是完全被炸弹包围住的

总体思路:

1.计算二维前缀和f:f[i][j]表示以(0,0)坐标为矩形左上角到以(i,j)坐标位矩形右下角的矩形区域的价值之和

2.枚举所有炸弹摆放情况:由于炸弹只能与x轴y轴平行的摆放,所以我们可以根据右下角坐标和边长m来枚举确定所有摆放情况

3.计算每个摆放情况的炸弹炸毁价值总和并用max维护answer,确保遍历结束后answer就是最大炸毁价值

解题:
 

nclude<iostream>
using namespace std;
int n, m;
const int N = 5010;
int a[N][N];//记录初始状态
int f[N][N];//前缀和
int answer;
int main()
{cin >> n >> m;while (n--){int x, y, v;cin >> x >> y >>v;x++, y++;//将索引基准升为1a[x][y] += v;//每一个位置价值可能重复叠加}//前缀和计算for (int i = 1; i <= 5001; i++){for (int j = 1; j <= 5001; j++){f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + a[i][j];}}m = min(m, 5001);//将m大于整个区域的情况兼容//枚举右下角坐标所有情况for (int i = m; i <= 5001; i++){for (int j = m; j <= 5001; j++){int x1 = i - m + 1;int y1 = j - m + 1;int sum = f[i][j] - f[x1 - 1][j] - f[i][y1 - 1] + f[x1-1][y1-1];answer = max(answer, sum);}}cout << answer << endl;return 0;
}

1.本题中坐标的边界就是5000,所以我们将N定义为5010就足够用来定义数组a和f了

2.记录数据的时候注意要用+=符号来添加,因为题目中说明了同一个位置可能存在多个目标,所以一个坐标位置的价值可能会叠加

3.为了兼容m大于边界的情况,我们将这种情况的m置为边界即可

P2280 [HNOI2003] 激光炸弹 - 洛谷

相关文章:

  • 每日一题(小白)回溯篇7
  • Vue中如何优雅地阻止特定标签的移除并恢复其原始位置
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day17
  • [c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用
  • 特伦斯便携钢琴V20有哪些优势
  • [预备知识]1. 线性代数基础
  • 4月21日星期一今日早报简报微语报早读
  • 颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
  • FTTR 全屋光纤架构分享
  • 【原创】Ubuntu20.04 安装 Isaac Gym 仿真器
  • 视频分析设备平台EasyCVR安防视频小知识:安防监控常见故障精准排查方法
  • init_tcicb函数有调用,但snapshot函数没调用
  • Spring AOP优化in查询,性能提升巨大
  • Unreal如何使用后处理材质实现一个黑屏渐变效果
  • Linux常见指令介绍中(入门级)
  • VSCode远程图形化GDB
  • 【React】获取元素距离页面顶部的距离
  • 多维度信息捕捉:利用向量、稀疏向量、全文搜索及张量实现RAG的极致性能
  • 随机面试--<二>
  • 可穿戴无线生理信号采集贴片产品市场需求简析
  • 哈马斯:愿与以色列达成为期5年的停火协议
  • 甘肃公布校园食品安全专项整治案例,有食堂涉腐败变质食物
  • 向左繁华都市,向右和美乡村,嘉兴如何打造城乡融合发展样本
  • 新能源车盈利拐点:8家上市车企去年合计净利854亿元,多家扭亏
  • 央行就《关于规范供应链金融业务引导供应链信息服务机构更好服务中小企业融资有关事宜的通知》答问
  • 美国第一季度经济环比萎缩0.3%