将前缀和扩展到二维数组:
计算炸弹覆盖范围内的目标价值:
r*r范围 = 右下角点处的前缀和 - 多出部分的前缀和 + 重复减掉的部分
#include<iostream>
using namespace std;
//若目标位于爆破正方形的边上,该目标将不会被摧毁。
//边长为r的正方形,最多可以摧毁r*r个点
//思想:将前缀和扩展到二维
int map[5010][5010]; //最大地图范围
int main(){
int n, r;
cin >> n >> r;
//记录边界值,初始化为最小值r
int x_boundary = r;
int y_boundary = r;
for(int i = 0, x, y, v; i < n; i++){
cin >> x >> y >> v;
map[++x][++y] = v; //x与y的边界从0开始,所以记录时应将其+1操作
x_boundary = max(x_boundary, x);
y_boundary = max(y_boundary, y);
}
//计算前缀和,map[i][j]表示0~i行,0~j列所有元素的和
for(int i = 1; i <= x_boundary; i++){
for(int j = 1; j <= y_boundary; j++){
map[i][j] = map[i-1][j] + map[i][j-1] - map[i-1][j-1] + map[i][j];
}
}
int cnt = 0; //r*r区域内的和
for(int i = r; i <= x_boundary; i++){
for(int j = r; j <= y_boundary; j++){
cnt = max(cnt, map[i][j] - map[i-r][j] - map[i][j-r] + map[i-r][j-r]);
}
}
cout << cnt <<endl;
return 0;
}

京公网安备 11010502036488号