前缀和(题目)

EG1 激光炸弹

题意:给你n个点的坐标及权值,用r * r的范围最大覆盖是多少

前缀和(题目)_第1张图片

题解

//二维的 前缀和 问题
#include 
#include 

using namespace std;

int n, r;
int ta, tb;
int x, y, w;
int sum[5005][5005];
int ans = 0;
int main()
{
	cin >> n >> r;					//	r 为 正方形的范围
	ta = r;
	tb = r;
	for (int i = 0; i < n; i++)			//首先利用 for 循环 扫一遍算出每个点的权值
												// sum[i][j]表示从(1,1)到(i,j)里所含的总值
	{
		cin >> x >> y >> w;
		x++;
		y++;
		sum[x][y] += w;
		ta = max(ta, x);
		tb = max(tb, y);
	}
	for (int i = 1; i <= ta; i++)
		for (int j = 1; j <= tb; j++)
			sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
	for (int i = r; i <= ta; i++)
		for (int j = r; j <= tb; j++)
			ans = max(ans, sum[i][j] - sum[i - r][j] - sum[i][j - r] + sum[i - r][j - r]); // 相当于求以i,j分开的四个矩形中的右上方的矩形
	cout << ans << endl;
	return 0;
}

转载于:https://www.cnblogs.com/lightac/p/10534730.html

你可能感兴趣的:(前缀和(题目))