NC20032 激光炸弹

题目

  • 原题地址:激光炸弹
  • 题目编号:NC20032
  • 题目类型:前缀和
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 262144K,其他语言524288K

1.题目大意

  • 给定地图中几个点的位置及价值,用爆炸范围为正方形的炸弹炸,求炸到的最大价值

2.题目分析

  • 二维前缀和:
    • 累加:m[i][j] += m[i][j-1] + m[i-1][j] - m[i-1][j-1]
    • 计算:ans = max(ans, m[i][j]-m[i-r][j]-m[i][j-r]+m[i-r][j-r])
  • 需要注意最大边界的值不得小于半径范围,即初始mx=r, my=r

3.题目代码

#include <bits/stdc++.h>

using namespace std;

int m[5005][5005];

int main() {
    int n, r;
    cin >> n >> r;
    int x, y, v;
    int mx=r, my=r;
    for(int i=0;i<n;i++)
    {
        cin >> x >> y >> v;
        x++, y++;
        m[x][y] = v; 
        mx = max(mx, x);
        my = max(my, y);
    }
    for(int i=1;i<=mx;i++)
        for(int j=1;j<=my;j++)
            m[i][j] += m[i][j-1] + m[i-1][j] - m[i-1][j-1];
    int ans = 0;
    for(int i=r;i<=mx;i++)
        for(int j=r;j<=my;j++)
            ans = max(ans, m[i][j]-m[i-r][j]-m[i][j-r]+m[i-r][j-r]);
    cout << ans << endl;
}
posted @ 2022-06-27 20:46  仪战群儒  阅读(100)  评论(0)    收藏  举报