题目大意:有一个1025*1025的矩阵,每个矩阵元素保存这个点上老鼠的数量。现有一种气体炸弹,能覆盖“半径”为d的矩形,在这个范围内可以消灭所有的老鼠,让你找出合适的放置炸弹的位置使的消灭的老鼠数量最多。
如果暴力枚举的话会超时,考虑到题中有老鼠的点不超过20000个,可以用m[i][j]保存将炸弹放到第i行第j列时消灭老鼠的数量(初始化为0),当某个点有老鼠时更新“半径”为d范围内的m值(加上该点的老鼠数量),这样可以减小时间复杂度。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 #define MAXN 1030 6 7 int m[MAXN][MAXN]; 8 9 int main() 10 { 11 #ifdef LOCAL 12 freopen("in", "r", stdin); 13 #endif 14 int T; 15 scanf("%d", &T); 16 while (T--) 17 { 18 int d; 19 scanf("%d", &d); 20 int n; 21 scanf("%d", &n); 22 memset(m, 0, sizeof(m)); 23 for (int i = 0; i < n; i++) 24 { 25 int x, y, num; 26 scanf("%d%d%d", &x, &y, &num); 27 int x_min = max(0, x-d); 28 int x_max = min(1024, x+d); 29 int y_min = max(0, y-d); 30 int y_max = min(1024, y+d); 31 for (int p = x_min; p <= x_max; p++) 32 for (int q = y_min; q <= y_max; q++) 33 m[p][q] += num; 34 } 35 int lmax = 0, x = 0, y = 0; 36 for (int i = 0; i <= 1024; i++) 37 for (int j = 0; j <= 1024; j++) 38 if (m[i][j] > lmax) 39 { 40 x = i; 41 y = j; 42 lmax = m[i][j]; 43 } 44 printf("%d %d %d ", x, y, lmax); 45 } 46 return 0; 47 }