解题思路:
本题分析时目标所在位置一定是在网格上而不是在方框内
实现思路:
这里因为激光炸框有两种放置方式,因为题目中要求击中的目标值最多,所以应该选择第二种即图B,目标数量=r*r
代码:
#include<iostream>
using namespace std;
const int N=5010;
typedef long long ll;
int s[N][N];
int n,r;
int main(){
cin>>n>>r;
int q,p;
r=min(5001,r);//如果炸弹的R大于等于5001即可覆盖全部的区域,所以取最小值5001
q=p=r;//减少特判条件
while(n--){
int x,y,w;
cin>>x>>y>>w;
s[x+1][y+1]+=w;
q=max(q,x+1);
p=max(p,y+1);
}
for(int i=1;i<=q;i++){
for(int j=1;j<=p;j++){
s[i][j]=s[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
}
}
int res=0;
for(int i=r;i<=q;i++){
for(int j=r;j<=p;j++){
res=max(res,s[i][j]-s[i][j-r]-s[i-r][j]+s[i-r][j-r]);
}
}
cout<<res;
return 0;
}