将前缀和扩展到二维数组:
计算炸弹覆盖范围内的目标价值:
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; }