【前缀和】截断数组、K倍区间、激光炸弹

news2024/9/21 12:37:39

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

题目:截断数组

白话讲解:

题解:

代码实现:

题目:激光炸弹

白话讲解:

题解:

代码实现:

题目:k倍区间

题目描述

输入描述

输出描述

输入输出样例

白话讲解:

题解:

代码实现:

完结撒花:


题目:截断数组

给定一个长度为 n 的数组 a1,a2,…,an

现在,要将该数组从中间截断,得到三个非空子数组。

要求,三个子数组内各元素之和都相等。

请问,共有多少种不同的截断方法?

输入格式

第一行包含整数 n。

第二行包含 n个整数 a1,a2,…,an

输出格式

输出一个整数,表示截断方法数量。

数据范围

前六个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤1e5,−10000≤ai≤10000。

输入样例1:

4
1 2 3 3

输出样例1:

1

输入样例2:

5
1 2 3 4 5

输出样例2:

0

输入样例3:

2
0 0

输出样例3:

0

白话讲解:

将一个数组中个元素之和三等分,有几种分法

题解:

通过题目所给提示,这题很容易想到用前缀和来处理。

三个非空数组,意味着可以讲三个数组分为两个部分,末端位置到n为一个区间,大小为元素总和的三分之一,0-n-1为元素总和的三分之二。

先判断元素总和是否能被三整除若不能被三整除则无法分成三个区间和,直接输出0即可

之后遍历前缀和数组,若一个区间为大小为三分之一,则记录下来cnt,之后若这个区间后的一个点的大小为三分之二,则说明整个数组被三等分了,则加上前面三等分点的个数。

代码实现:

#include<iostream>
using namespace std;
const int N=100010;
int s[N];
int n=0;
int ans=0;
typedef long long ll ;
ll res;
int main()
{
    cin>>n;
    s[0]=0;
    int x=0;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        s[i]=s[i-1]+x;
    }
    if(s[n]%3)cout<<0;
    else
     {
        ll res=0,cnt=0;
        for(int j=2;j<n;j++)
        {
            if(s[j-1]==s[n]/3)cnt++;
            if(s[j]==s[n]/3*2)res+=cnt;
        }
        printf("%lld",res);
     }
     return 0;
}

题目:激光炸弹

地图上有 N 个目标,用整数 Xi,Yi 表示目标在地图上的位置,每个目标都有一个价值 Wi。

注意:不同目标可能在同一位置。

现在有一种新型的激光炸弹,可以摧毁一个包含 R×R个位置的正方形内的所有目标。

激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和 x,y轴平行。

求一颗炸弹最多能炸掉地图上总价值为多少的目标。

输入格式

第一行输入正整数 N 和 R,分别代表地图上的目标数目和正方形包含的横纵位置数量,数据用空格隔开。

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

输出格式

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

数据范围

0≤R≤1e9
0<N≤100000,
0≤Xi,Yi≤5000
0≤Wi≤1000

输入样例:

2 1
0 0 1
1 1 1

输出样例:

1

白话讲解:

在地图上若干个点放置在财物,之后给你一个炸弹,爆炸范围为R*R的一个正方形,也就是说能框住R*R内的所有财物,如何放置炸弹,损毁的财物价值最大

题解:

一个典型的二维前缀和的问题,讲所有财物的价值存入对应的点,之后进行二位前缀和的处理即可。

注意 虽然R的范围是1e9,但是财物的范围仅为5000,所以我们R的范围只需要比5000大一点即将所有财物包括。

另外,这里受限于内存,最好将元素数组与前缀和数组一起存储,即用一个数组来处理前缀和的关系。

一些优化的做法,若我们前缀和处理的时候直接枚举5000大小的地图,会导致时间效率太低,虽然也能过,但是最好拓展下自己的思维,行列当中不需要枚举5000,枚举到,x,y出现的最大大小就可以了,之后就是处理二位前缀和,不会的话可以看看之前的博客 前缀和

代码实现:

#include <algorithm>
#include<iostream>
using namespace std;
const int N=5010;
int s[N][N]={0};
int main()
{
    int cnt,r,n,m;
    int x=0,y=0,w=0;
    cin>>cnt>>r;
    r=min(5001,r);
    n=m=r;
    while(cnt--)
    {
 
        cin>>x>>y>>w;
        x++,y++;
        n=max(n,x);
        m=max(m,y);
        s[x][y]+=w;
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;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<=n;i++)
    {
        for(int j=r;j<=m;j++)
        {
            res=max(res,s[i][j]+s[i-r][j-r]-s[i-r][j]-s[i][j-r]);
        }
    }
    cout<<res;
}

题目:k倍区间

题目描述

给定一个长度为 N 的数列A1​,A2​,⋯AN​,如果其中一段连续的子序列Ai​,Ai​+1,⋯Aj​ ( �≤�i≤j ) 之和是 K 的倍数,我们就称这个区间[i,j] 是 K 倍区间。

你能求出数列中总共有多少个 K 倍区间吗?

输入描述

第一行包含两个整数 N 和 K(1≤N,K≤1e5 )。

以下 N 行每行包含一个整数Ai​ ( 1≤Ai​≤1e5 )

输出描述

输出一个整数,代表 K 倍区间的数目。

输入输出样例

示例

输入

5 2
1
2
3
4
5

输出

6

白话讲解:

找出长度区间内元素和为k的倍数,并统计这样的区间有几个。

题解:

长度区间内的元素,我们很容易就想到用前缀和的方式来处理。所以我们试试用暴力做法怎么去做

进行两层循环(类似双指针)右指针固定区间长度,左指针来遍历这个区间内前缀和,最后判断是否为k的倍数。

某一个区间长度的元素大小s[R]-s[L-1]为R到L的区间内元素的总和。我们要找到是(s[R]-s[L-1])%k=0.等式变换下就成为了 s[R]%k=s[L-1]%k 这时候要做的就变成去找s[L-1]%k何时与s[R]%k相等

我们可以拿一个数组来记录一下s[R]%k相同余数出现的个数 即cnt[s[R]%k]

当res+=该余数出现的次数。这里实现的效果其实为:第一次不会相加。只有第二次才会加上一,第三次加上二.......

另外需要初始化一下cnt[0]=1;

我是这样理解的,假设k=3,你的原始数组为 1 2 3 4 5 此时当i=2时s[2]=3 已经满足了k倍区间,但是因为第一次出现,所以不记录的原则,是不会被计算的。所以就导致答案少了一个。 

代码实现:

#include<iostream>
using namespace std;
const int N=100010;
typedef long long ll;
ll s[N],cnt[N];
int main()
{
    int n=0,k=0;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&s[i]);
        s[i]+=s[i-1];
    }

    ll res=0;
    cnt[0]=1;
   for(int i=1;i<=n;i++)
   {
    res+=cnt[s[i]%k];
    cnt[s[i]%k]++;
   }
   printf("%lld\n",res);
   return 0;
}

完结撒花:

🌈本篇博客的内容【】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小目标识别——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现过程参考实现思路 使用C进行实现&#xff0c;开发平台是clion&#xff0c;并没有使…

zencart/opencart/wordpress外贸独立站最少需要多少钱

以程序员的职位进入跨境电商行业已经有10年了&#xff0c;接触过不少大大小小的老板客户&#xff0c;我遇到最多的问题就是搭建一个站要多少钱&#xff1f;实话说这问题问的有些粗糙。如果我遇到不负责的公司他可能会直接报价1W&#xff0c;2W或更多&#xff0c;也有可能遇到兼…

【STM32MP157应用编程】3.控制PWM

目录 PWM文件 指令操作PWM 程序操作PWM 程序说明 程序代码 3_PWM_1.c 启动交叉编译工具 编译 拷贝到开发板 测试 PWM文件 在/sys/class/pwm目录下&#xff0c;存放了PWM的文件。 pwmchip0和pwmchip4目录对应了MP157 SoC的2个PWM控制器&#xff0c;pwmchip0对应的是M…

【Python】torch.norm()用法解析

【Python】torch.norm()用法解析 文章目录【Python】torch.norm()用法解析1. 介绍1.1 p-范数1.2 Frobenius 范数1.3 核范数2. API3. 示例1. 介绍 torch.norm()是对输入的tensor求对应的范数。tensor的范数有以下三种&#xff1a; 1.1 p-范数 1.2 Frobenius 范数 即&#xff…

Linux-GCC介绍+入门级Makefile使用

前言&#xff08;1&#xff09;我们都知道&#xff0c;在Linux中编译.c文件需要使用gcc -o .c文件的指令来将C文件变成可执行文件。但是我们有没有发现&#xff0c;如果我们需要编译大一点的工程&#xff0c;后面需要加上的.c文件是不是太多了&#xff1f;感觉非常的麻烦。&…

linux篇【16】:传输层协议<后序>

目录 六.滑动窗口 &#xff08;1&#xff09;发送缓冲区结构 &#xff08;2&#xff09;滑动窗口介绍 &#xff08;3&#xff09;滑动窗口不一定只会向右移动。滑动窗口可以变大也可以变小。 &#xff08;4&#xff09;那么如果出现了丢包, 如何进行重传? 这里分两种情况…

「微报告」激光雷达前装“成色”

激光雷达正处于第一波规模上车期。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装标配搭载激光雷达12.99万台&#xff0c;配套车辆11.18万辆&#xff0c;同比分别增长1544.30%和2626.82%。此外&#xff0c;提供选装的…

华为OD机试题,用 Java 解【相对开音节】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

基于BERT-PGN模型的中文新闻文本自动摘要生成——文本摘要生成(论文研读)

基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09; 基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09;摘要&#xff1a;0 引言相关研究2 BERT-PGN模型2. 1 基于预训练模型及多维语义特征的词向量获取阶段2. 1. 1 BE…

Python3-数据结构

Python3 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff0c;一句话概括即&#xff1a;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的…

3.3 GPIO输入

按键1.1 按键介绍•按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开•按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动1.2 按键的四种接法P1是最常用的接法&#xff0c;p1…

【小程序】django学习笔记1

网页能用&#xff0c;不知道小程序能不能用。应该能吧。。。。。创建django程序文件包&#xff0c;xxx处是给该文件夹起个名django-admin startproject xxx一个project是由很多个app&#xff08;小应用&#xff09;组成的在文件夹目录下创建一个app&#xff0c;xxx处给该app起个…

脑雾到来的6个症状

在阳康后的一段时间里&#xff0c;很多人发现自己脑力不似从前&#xff0c;长时间的修养也没能彻底恢复&#xff0c;以为自己有后遗症&#xff0c;十分紧张。其实&#xff0c;脑雾不是专业的医学名词&#xff0c;它是对一类症状的统称&#xff1a;健忘、注意力不集中、思维迟钝…

第17天-整合Redis缓存改造三级分类,并解决缓存击穿、穿透、雪崩、一致性问题

1.缓存 1.1.缓存使用 为了系统性能的提升&#xff0c;一般都会将部分数据放入缓存中&#xff0c;达到快速响应的目的。而数据库承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c…

布隆过滤器Bloom -> Redisson系列-3

接上文&#xff1a;RBucket对象桶 -&#xff1e; Redisson系列-1&#xff08;让redis操作更优雅&#xff09;_子书少卿的博客-CSDN博客 本质上布隆过滤器是一种数据结构&#xff0c;是一种比较巧妙的概率性数据结构&#xff0c;特点是可以高效的插入和查询&#xff0c;可…

浅谈一下虚拟机栈

虚拟机栈 概述 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多的…

SpringBoot学习笔记(二)配置文件

1、配置文件SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1b;application.propertiesapplication.yml配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值&#xff1b;SpringBoot在底层都给我们自动配置好&#xff1b;YAML&#xff1a;以数…

MySQL常用函数整理

MySQL常用函数整理sql函数分类一、流程控制1、判断值为null或空字符串2、IF函数3、IFNULL函数4、CASE函数(1) 相当于switch case的作用(2) 相当于if elseif的作用5、COALESCE函数二、字符串类&#xff08;GBT答案&#xff09;1、用于select、insert等子句中2、用于where子句中其…

来吧!接受Kotlin 协程--线程池的7个灵魂拷问

前言 之前有分析过协程里的线程池的原理&#xff1a;Kotlin 协程之线程池探索之旅(与Java线程池PK)&#xff0c;当时偏重于整体原理&#xff0c;对于细节之处并没有过多的着墨&#xff0c;后来在实际的使用过程中遇到了些问题&#xff0c;也引发了一些思考&#xff0c;故记录之…

从零开始学习c语言|21、动态内存管理

一、malloc函数 1、什么是malloc函数 malloc是memery(内存)和allocate(分配)的缩写&#xff0c;顾名思义&#xff0c;malloc函数为动态分配内存的意思 2、malloc函数语句 int *p(int *)malloc(sizeof(int))malloc函数的形参为申请的内存空间大小&#xff0c;上述申请了一个i…