本文共 1617 字,大约阅读时间需要 5 分钟。
为了解决这个问题,我们需要找到一种方法来确定炸弹的最大炸击价值。炸弹的范围是一个正方形,边长为r,且只有严格在正方形内部的宝物才会被炸掉。我们可以使用前缀和的思想来快速计算特定矩形区域内的宝物总价值,从而高效地解决这个问题。
#includeusing namespace std;int main() { int n, r; cin >> n >> r; r = min(r, 5002); // 限制r的最大值为5002 int s[5003][5003]; // 初始化前缀和矩阵 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { int x, y, w; cin >> x >> y >> w; s[x + 1][y + 1] += w; // 为了避免越界,使用x+1, y+1 } } // 构建前缀和矩阵 for (int i = 1; i <= 5002; ++i) { for (int j = 1; j <= 5002; ++j) { s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1]; } } int max_value = 0; // 遍历所有可能的r-1范围的位置 for (int i = r; i <= 5002; ++i) { for (int j = r; j <= 5002; ++j) { int left = i - r + 1; int top = j - r + 1; if (left < 1 || top < 1) { continue; // 越界情况,无法形成有效的正方形 } int current = s[i][j] - s[left - 1][j] - s[i][top - 1] + s[left - 1][top - 1]; if (current > max_value) { max_value = current; } } } cout << max_value;}
这种方法利用了前缀和的思想,确保了计算的高效性,能够在大规模数据下快速解决问题。
转载地址:http://sagfk.baihongyu.com/