HNOI2003 激光炸弹

[HNOI2003]激光炸弹

https://ac.nowcoder.com/acm/problem/20032

题目大意:输入一个N与R,之后N行输入每个炸弹的坐标与价值,问你在边长为N的正方形下什么时候价值最大
思路:二维前缀和,画图利用公式v[i][j]=v[i-1][j]+v[i][j-1]-v[i][j]+val得出每个点到(0,0)的总价值,再利用两个for循环寻找正方形内价值即可
代码如下:#include

using namespace std;
int v[5000][5000]={0};
int sumv[5000][5000]={0};
int main()
{
int n,r,i;
cin>>n>>r;
int a,b,val;
int maxx=r,maxy=r;//边界,不能设为0,不然输入的时候坐标输入小于R的时候for循环就不会找正方形了
for(i=0;i<n;i++){
cin>>a>>b>>val;
a++,b++;
v[a][b]=val;
maxx=max(a,maxx);
maxy=max(b,maxy);
}
for(i=1;i<=maxx;i++){
for(int j=1;j<=maxy;j++){
v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1];//求二维前缀和
}
}
int ans=0;//最大价值
for(i=r;i<=maxx;i++){
for(int j=r;j<=maxy;j++){
ans=max(ans,v[i][j]-v[i-r][j]-v[i][j-r]+v[i-r][j-r]);//看当前正方形内的价值是否为最大价值,是就ti'h
}
}
cout<<ans;
return 0;
}

全部评论

相关推荐

粗心的熊熊求求offer:什么内容都没有还弄两页
点赞 评论 收藏
分享
白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务