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

题解:洛谷 P2280 [HNOI2003] 激光炸弹

【题目来源】

洛谷:[P2280 HNOI2003] 激光炸弹 - 洛谷

【题目描述】

一种新型的激光炸弹,可以摧毁一个边长为 m 的正方形内的所有目标。现在地图上有 \(n\) 个目标,用整数 \(x_i\) , \(y_i\) 表示目标在地图上的位置,每个目标都有一个价值 \(v_i\)。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为 \(m\) 的边必须与 \(x\) 轴,\(y\) 轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。

现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。

可能存在多个目标在同一位置上的情况。

【输入】

输入的第一行为整数 \(n\) 和整数 \(m\)

接下来的 \(n\) 行,每行有 \(3\) 个整数 \(x, y, v\),表示一个目标的坐标与价值。

【输出】

输出仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过 \(32767\) )。

【输入样例】

2 1
0 0 1
1 1 1

【输出样例】

1

【算法标签】

《洛谷 P2280 激光炸弹》 #动态规划,dp# #枚举# #前缀和# #各省省选# #湖南# #2003#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 5005;          // 定义二维数组最大尺寸
int n, m;                     // n: 点数, m: 正方形边长
int a[N][N];                  // 原始值数组
int s[N][N];                  // 二维前缀和数组int main()
{// 输入点数和正方形边长cin >> n >> m;// 输入每个点的坐标和值for (int i = 1; i <= n; i++){int x, y, v;cin >> x >> y >> v;x++; y++;             // 坐标偏移(从1开始)a[x][y] += v;        // 累加值到对应位置}// 计算二维前缀和数组for (int i = 1; i <= 5001; i++){for (int j = 1; j <= 5001; j++){// 二维前缀和公式s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];}}int res = 0;             // 存储最大和// 遍历所有可能的m×m正方形for (int i = m; i <= 5001; i++){for (int j = m; j <= 5001; j++){// 计算当前m×m正方形的和int current = s[i][j] - s[i-m][j] - s[i][j-m] + s[i-m][j-m];res = max(res, current);  // 更新最大值}}// 输出最大和cout << res << endl;return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;const int N = 10005;          // 定义二维数组最大尺寸
int n, m;                     // n: 点数, m: 正方形边长
int a[N][N];                  // 原始值数组
int s[N][N];                  // 二维前缀和数组int main()
{// 输入点数和正方形边长cin >> n >> m;// 输入每个点的坐标和值for (int i = 1; i <= n; i++){int x, y, v;cin >> x >> y >> v;x++; y++;             // 坐标偏移(从1开始)a[x][y] += v;         // 累加值到对应位置}// 计算二维前缀和数组for (int i = 1; i <= 5005; i++){for (int j = 1; j <= 5005; j++){// 二维前缀和公式s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];}}int res = 0;              // 存储最大和// 遍历所有可能的m×m正方形for (int i = m; i <= 5005; i++){for (int j = m; j <= 5005; j++){// 计算当前m×m正方形的和int current = s[i][j] - s[i - m][j] - s[i][j - m] + s[i - m][j - m];res = max(res, current);  // 更新最大值}}// 输出最大和cout << res << endl;return 0;
}

【运行结果】

2 1
0 0 1
1 1 1
1
http://www.jsqmd.com/news/491163/

相关文章:

  • 终极指南:如何利用authentik构建金融级合规身份验证系统
  • 2026年盘点:五大简单好用的进销存软件,哪款才是效率之王?
  • 突破非幺正演化难题:MLGO微算法科技研发概率量子算法实现虚时间演化新路径
  • 如何掌握Type Challenges中的Exclude类型:从零开始的TypeScript进阶指南
  • 如何用SeleniumBase实现自动化测试ROI最大化:提升团队效率的完整指南
  • 如何通过Hyperswitch模块化支付实现成本可观测性:2026实战指南
  • 永辉超市卡回收行情看涨,闲置变现正当时 - 京顺回收
  • 掌握TypeScript条件类型If:从入门到实战的完整指南
  • 终极 Waybar 1.0 新特性解析:模块化架构如何彻底改变你的 Wayland 体验
  • 2026厂房环保工程好公司推荐 设计施工一体化承包商怎么选 - 品牌2026
  • whois gem核心功能揭秘:域名、IPv4/IPv6查询全攻略
  • 如何快速掌握Type Challenges中的Unshift类型挑战:初学者完整指南
  • 【C++】std::wstring无法与-fshort-wchar同时使用
  • 7个实用技巧!AISuite日志管理策略:构建企业级AI应用的可观测性体系
  • 如何用X-Spider高效下载Twitter历史媒体?日期范围筛选与重复文件跳过技巧
  • 终极指南:Semantic Kernel提示模板语言——LLM应用开发的核心引擎
  • 如何快速掌握TypeScript类型挑战:从Hello World开始的完整指南
  • 大润发购物卡回收指南:最快速变现的全流程解析 - 团团收购物卡回收
  • 如何快速掌握TypeScript数组第一个元素类型获取:Type Challenges实战指南
  • 2026厂房管道安装工程承包商推荐 ,靠谱口碑好的施工方甄选指南 - 品牌2026
  • 如何使用xManager实现多渠道打包:不同应用商店配置完全指南
  • 如何掌握TypeScript数字范围类型?Type-Challenges中的终极实现指南
  • 揭秘libSQL区块链:不可变数据存储的7大创新应用场景
  • 如何轻松掌握TypeScript元组长度推导:Type Challenges实战指南
  • 合金分析仪(XRF分析仪)怎么选?10 大主流企业盘点,聚焦日立分析仪器的全球技术与本土服务 - 品牌推荐大师1
  • 如何快速搭建高效用户反馈系统:xManager集成GitHub Issues全指南
  • 如何快速集成libSQL到iOS和Android:移动端数据库解决方案完整指南
  • 2026最新!10个降AIGC平台深度测评:全行业通用降AI率神器推荐
  • 电子半导体厂房恒温恒湿工程怎么做?揭秘高精度环境控制施工关键点与承包商选择指南 - 品牌2026
  • 如何掌握Type-Challenges中的Omit类型工具:从零开始的TypeScript进阶指南