[HNOI2003]激光炸弹---二维前缀和

news/2024/7/7 22:44:23

题目描述

一种新型的激光炸弹,可以摧毁一个边长为 m 的正方形内的所有目标。现在地图上有 n 个目标,用整数 xi​ , yi​ 表示目标在地图上的位置,每个目标都有一个价值 vi​ .激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为 m 的边必须与 x 轴, y 轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。

现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。

输入格式

输入的第一行为整数 n 和整数 m,

接下来的 n 行,每行有 3 个整数 x,y,v,表示一个目标的坐标与价值。

输出格式

输出仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过 3276732767 )。

样例 #1

样例输入 #1

2 1
0 0 1
1 1 1

样例输出 #1

1

提示

数据规模与约定
  • 对于 100% 的数据,保证 1≤n≤10^4,0≤xi​,yi​≤5×10^3,1≤m≤5×10^3,1≤vi​<100。

解题思路

看完题目可知就是在一个二维数组中,随机在某个位置增加某个数,然后求在 m x m 的正方形区域内二维数组的和的最大值是多少?

对于这种需要求到某个矩阵的子矩阵就需要想到二维前缀和

我们先来回忆前缀和的初始化和求子矩阵的和的公式

S[ i ][ j ] = S[ i - 1 ][ j ] + S[ i ][ j - 1 ] - S[ i - 1 ][ j - 1 ] + a [ i ][ j ]; //前缀和初始化

S[ x2 ][ y2 ] - S[ x1 - 1 ][ y2 ] - S[ x2 ][ y1 - 1 ] + S[ x1 - 1 ][ y1 - 1 ] //求子矩阵的和

好,上代码!

#include <iostream>

using namespace std;

int n, m;
const int N = 5010;
int a[N][N];
//int s[N][N]; //用两个数组内存可能会超,只需要将s[N][N]替换为a[N][N]就可以了
int main(void)
{
    scanf("%d%d", &n, &m);


    while (n--)
    {
        int x = 0, y = 0;
        int v = 0;
        scanf("%d%d%d", &x, &y, &v);
        a[x + 1][y + 1] += v;  //因为前缀和的下标都是从1开始的(防止边界问题)
    }
  

    for (int i = 1; i < N; i++) //求前缀和,循环次数不一定为我这样的
    {
        for (int j = 1; j < N; j++)
        {
            a[i][j] = a[i][j - 1] + a[i - 1][j] + a[i][j] - a[i - 1][j - 1];
        }
    }

   
    
    int max = -1;

    //写法一,我个人是比较推荐写法二,数组不容易越界
    for (int i = 1; i < N - m; i++) //循环次数不一定为我这样的
    {
        for (int j = 1; j < N - m; j++)
        {
            //x2=i+m-1 y2=j+m-1        x1=i y1=j
            int r = a[i + m - 1][j + m - 1] - a[i - 1][j + m - 1] - a[i + m - 1][j - 1] + a[i - 1][j - 1];
            if (r >= max)
            {
                max = r;
            }
        }
    }
    /* 写法二
    for (int i = m; i < N ; i++)
    {
        for (int j = m; j < N ; j++) 
        {
            //x2 = i     y2 = j     x1 = i-m+1     y1 = j-m+1
            int r = a[i ][j ] - a[i ][j -m] - a[i - m ][j ] + a[i - m ][j - m];
            if (r >= max)
            {
                max = r;
            }
        }
    }*/

    printf("%d\n", max);
    return 0;
}

在做这题时,我在求子矩阵的和时,因为数组的边界出了很多问题,所以出错了可以先看看数组是否越界了

在排除错误的过程中还可以先打印 5行5列看看数组是怎么样的,分别在输入后求前缀和之前  和  求前缀和之后 打印

代码

for (int i = 1; i <= 5; i++)
{
	for (int j = 1; j <= 5; j++)
	{
		printf("%d ", a[i][j]);
	}
	printf("\n");
}


http://lihuaxi.xjx100.cn/news/1602554.html

相关文章

深度学习纯小白如何从零开始写第一篇论文?看完这篇豁然开朗!

&#x1f4e2;前言 上个月小贾消失了一段时间&#xff0c;原因就是。。。 写论文去啦&#xff01;&#xff01;&#xff01; 先拿我导的认可镇个楼&#xff1a; 本篇文章将分享我个人从迷茫地找方向→苦苦做了48次实验才高效涨点→写论文到头秃等等一系列真实经历&#xff0c…

当我们谈论量化时,我们在谈论什么?量化投资常见策略有哪些?| 融券T0和高频交易详解【邢不行】

最近关于量化的争议不断&#xff0c;很多人甚至建议取缔量化。 部分人认为量化以高频交易配合融券变相实现T0&#xff0c;赚走了市场所有的钱&#xff0c;有失公正。 高频交易大家都听过&#xff0c;即凭借程序在几秒甚至几毫秒内完成一笔交易&#xff0c;有人认为这对还在盯盘…

C++中的强制转换

目录 背景介绍&#xff1a; C static_cast 的使用 C dynamic_cast 的使用 C reinterpret_cast 的使用 C const_cast 的使用 强制转换小结&#xff1a; 资料引用&#xff1a; 背景介绍&#xff1a; 在编写很多工程代码的时候&#xff0c;我们经常会遇到类型转换的问题。当…

asgi与wsgi与uwsgi的区别

Web 服务器和 Web框架 Web服务器即用来接受客户端请求&#xff0c;建立连接&#xff0c;转发响应的程序。至于转发的内容是什么&#xff0c;交由Web框架来处理&#xff0c;即处理这些业务逻辑。如查询数据库、生成实时信息等。 Nginx是一个Web服务器&#xff0c;Django或flask就…

vue-1

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 …

ref与DOM-findDomNode-unmountComponentAtNode知识点及应用例子

​​​​​​http​​​http://t.csdnimg.cn/og3BI 知识点讲解↑ 需求: (下载/导出 用post请求时:) 实例: react部分代码 1、点击下载按钮&#xff0c;需要传给后端数据&#xff0c;到数据扁平&#xff0c;不是那么复杂&#xff0c;只需url地址即可完成下载&#xff0c;后端…

Python中跨越多个文件使用全局变量

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 这个琐碎的指南是关于在 Python 中跨多个文件使用全局变量。 但是在进入主题之前&#xff0c;让我们简单地看看全局变量和它们在多个文件中的用途。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff…

上班第一天同事让我下载个小乌龟,我就去百度小乌龟。。。。

记得那会儿是刚毕业&#xff0c;去上班第一天&#xff0c;管我的那个上级说让我下载个小乌龟&#xff0c;等下把代码拉一下&#xff0c;我那是一脸懵逼啊&#xff0c;我在学校只学过git啊&#xff0c;然后开始磨磨蹭蹭吭吭哧哧的不知所措&#xff0c;之后我想也许百度能救我&am…