zoukankan      html  css  js  c++  java
  • 激光炸弹:二维前缀和

    激光炸弹

    题目描述:

    一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标。
    现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi。
    激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个边长为 R 的正方形的边必须和x,y轴平行。
    若目标位于爆破正方形的边上,该目标不会被摧毁。
    求一颗炸弹最多能炸掉地图上总价值为多少的目标。

    输入格式:

    第一行输入正整数 N 和 R ,分别代表地图上的目标数目和正方形的边长,数据用空格隔开。
    接下来N行,每行输入一组数据,每组数据包括三个整数Xi,Yi,Wi,分别代表目标的x坐标,y坐标和价值,数据用空格隔开。

    输出格式:

    输出一个正整数,代表一颗炸弹最多能炸掉地图上目标的总价值数目。

    数据范围:

    0<N≤10000
    0≤Xi,Yi≤5000

    输入样例:

    2 1
    0 0 1
    1 1 1

    输出样例:

    1

    题目大意:求一个矩形内边长为r的正方形内的权值,但是不知道矩形高度宽度,并且计算时正方形边上的不能算。

    解题描述:用n,m在输入的时候,记录一下最大高度和宽度,另外一个需要注意的是,矩形开始坐标是从0开始的,咱们构建的是从1开始的,所以输入的时候给+1.

    感觉难点就在于边界处理。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    const int N=5010;
    int g[N][N];
    int main(){
    	int q,r;
    	scanf("%d%d",&q,&r);
    	int n=r,m=r;
    	for(int i=0,x,y,w;i<q;i++){
    		scanf("%d%d%d",&x,&y,&w);
    		x++;													//咱们开始是从1开始的 ,注意+1 
    		y++;
    		n=max(n,x);
    		m=max(m,y);
    		g[x][y]+=w;
    	}
    	
    	for(int x=1;x<=n;x++)
    		for(int y=1;y<=m;y++)
    			g[x][y]+=g[x-1][y]+g[x][y-1]-g[x-1][y-1];			//求前缀和 
    		
    	int res=0;
    	for(int i=r;i<=n;i++)
    	for(int j=r;j<=m;j++)
    	res=max(res,g[i][j]-g[i-r][j]-g[i][j-r]+g[i-r][j-r]);		//注意边界不算 !!! 
    	
    	printf("%d
    ",res);
    	return 0;
    }
    
  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/52dxer/p/10530308.html
Copyright © 2011-2022 走看看