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

这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上。

经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值。

注意点:

1.为了防止被xi=0和yi=0的情况坑和方便进行前缀和优化处理,我们可以将每个点的坐标都+1再录入数组。

2.因为每个目标的价值都为正整数,所以我们可以直接用记录的数组进行前缀和处理,不然会超内存。

3.进行二维前缀和处理时,可以利用容斥原理算出每个正方形所覆盖的价值。

code:

#include<bits/stdc++.h> using namespace std; int n,r,ans=0,s[5050][5050]; int main() { scanf("%d%d",&n,&r); for(int i=1;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); scanf("%d",&s[a+1][b+1]); } for(int i=1;i<=5005;i++) { for(int j=1;j<=5005;j++) { s[i][j]+=s[i][j-1]; s[i][j]+=s[i-1][j]; s[i][j]-=s[i-1][j-1]; } } for(int i=r;i<=5005;i++) { for(int j=r;j<=5005;j++) ans=max(ans,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]); } printf("%d",ans); return 0; }

再推荐一道类似的题P2038 无线网络发射器选址(简单许多。。。)


__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/12229795.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示