前缀和 求数列的子序列的K倍区间

(直接截图比复制文字要好多了)

不会做的时候我去看了之前做的关于这道题目的笔记,

(Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1

只要发现了同余数的情况就说明有一个区间满足了题目的要求。

这个方法的精妙之处就在于前缀和包括了之前的前缀和和下一个的数字之和(相邻的两个是这样的,如此一来,单个数字 % k == 0的就也能够被检查到了,就是把单个数组也看作了是一个区间。准确说是结合才对。

(这里还是建议去多举几个例子,去理解一下这句话的含义))

不清楚问题,我直接去看了题解

顺着这个思路其实很容易就能发现一个方法——求出那些个区间再使用排列组合,把可能的组合都用公式计算出来。(考虑到一些区间是断裂的,由(Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1想到,一种特殊的可能就是区间里面的所有数字都可以被k整除)  但是转念一想,不是所有的数都一定是k的整数倍。但是受到Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1的影响,我还是只考虑了单个元素,而忘了区间的概念,区间的组合是可以用排列组合来处理的。于是我想到了下面的一一对比的方法。

package 练习;import java.util.*;public class K倍区间 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();int K = scan.nextInt();scan.nextLine();int number = 0;int[] sum = new int[N + 1];for (int i = 1; i <= N; i++) {sum[i] = scan.nextInt() + sum[i - 1];for(int j = 0; j < i; j++)if(sum[i] % K == sum[j] % K) number ++;scan.nextLine();}System.out.println(number);}
}

我想不明白,为什么我这for循环里面的for都似乎只有条件满足才执行的,为什么还是超时了。难道不管执不执行,两个for循环都会消耗大量的时间。

就是如此——

if语句本身的时间复杂度是O(1),即常数时间复杂度,不受问题规模N的影响。这是因为每次执行if语句时,仅进行一次条件判断,其执行时间是固定的,不随N的增大而增大。

时间复杂度能忽略掉if条件判断的情况是,其时间复杂度远远超过了if语句造成的影响。但是,如果if的执行次数是整个程序的大头就不能忽略了

事实上

每一条Java语句,或者任何编程语言中的语句,都有其执行所需的时间成本,可以理解为占有一定的“时间复杂度”。

找到占大头的开销语句,在没有积累起一些反例之前,不要被具体的例子蒙蔽了双眼,去考虑书上那些容易被忽略的知识。if 和 for循环里面的的都有可能让你的时间复杂度暴增。

回到问题本身,我们不难发现,这个if语句的时间复杂度为

N * (1 + 2 + 3 + ... + N)
= N * (N * (N + 1)) / 2
= O(N^3 / 2)
≈ O(N^3)

这在蓝桥杯里面肯定是不可能被判定得分的。(除了数据特别少的情况下)

不成立的时候也总过有没有方法能和sum[ i ]的相同值,就像人脑一样,可以直接比较,看到了相同的数值就直接比较。但是计算机就是直接比较的,全部都要找一遍(for循环)但是又回到了原点。

最后我去看了题解,发现

#include<bits/stdc++.h>
using namespace std;
int n,k,a;
long long ans,sum,book[100005];
int main(){cin >> n >> k;book[0]++;  //把S0放进去,因为S0=0,所以给book[0]++for(int i=1;i<=n;i++){scanf("%d",&a);sum=(sum+a)%k; //sum是前缀和 也就是Sibook[sum]++;}for(int i=0;i<k;i++)//注意 余数是0~m-1ans+=(book[i]*(book[i]-1))/2;cout << ans;return 0;} //by chenhaotian0219

这里面的book[sum]吸引力我的注意。

这不就是映射吗,通过同余定理,把映射后的值域(0 < 数值 < k)设置数组也很方便,数值区间确定了,数组大小就不是问题了。(sun[ i ] % k == n == f (x) ),Y值域就是满足我们要求的,结合数组的特点就能够解决问题了。

数据结构里面的散列表就是这样被设计的。

这样字直接比较就做到了,for循环只是为了然所有的sum[ i ]都显现出来。

也看到了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,sum,p[1000001],n,k,ans;
signed main(){cin>>n>>k;p[0]=1;//定义初始值for(int i=1;i<=n;i++){cin>>a;sum+=a;sum%=k;p[sum]++;//对应余数的个数加一}for(int i=0;i<k;i++){ans+=(p[i]*(p[i]-1)/2);//从n个数里面选两个,共有n*(n-1)/2种选法。}cout<<ans;return 0;
}
for(int i=0;i<k;i++){ans+=(p[i]*(p[i]-1)/2);//从n个数里面选两个,共有n*(n-1)/2种选法。}

这格代码看起来很突兀,其实是我一开始的排列组合思考的排列组合,但是这里的是区间的。(最后这个for循环是从0开始的,指的是多格倍数部分,不是一个区间的)

单个区间的已经被计算过了(x),那么 a1 、 a2、a3 ... an 那么就是 n - 1 + n -2 + n - 3 + .. + 3 + 2 + 1(最后一个没有在里面,你把数字和个数一一对应就可以验证这个结论)。或者你这样子想——其实相互比较多是相邻的两个的sum[ i ]比较,组合就是跨国几个,还是两两比较。

一些无关的


签注和 —— 数列的和,如果你熟读数学,那么你可能就会独立发现这个算法。这就是数学的奥秘。

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

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

相关文章

嵌入式Linux driver开发实操(二十一):linux device driver basic设备驱动程序基础

linux的架构框图: 内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。 用户空间是执行用户应用程序的地方。 内核模块是可以根据需要加载和卸载到内核中的代码片段。它们扩展了内核的功能,而无需重新启动系统。自定义代码可以通过两种方法添加到Linux内…

C++ —— 继承

什么是继承&#xff1f; 继承是指一种代码可以被复用的机制&#xff0c;在一个类的基础上进行扩展&#xff0c;产生的新类叫做派生类&#xff0c;被继承的类叫基类。&#xff08;也可称为子类和父类&#xff09; 继承的写法&#xff1a; class B : 继承方式 A (…

Java高级阶段面试题库(Redis数据库、MQ消息队列、kafka、SpringBoot + SpringCloud、MySQL、JVMJUC、其它)

文章目录 1. Redis数据库篇(忽略)1.1 简单介绍一下redis1.2 单线程的redis为什么读写速度快?1.3 redis为什么是单线程的?1.4 redis服务器的的内存是多大?1.5 为什么Redis的操作是原子性的&#xff0c;怎么保证原子性的&#xff1f;1.6 你还用过其他的缓存吗&#xff1f;这些…

学习Django

1.python安装是会有几个主要目录&#xff1a; 2.如果某个路径加入了环境变量&#xff0c;那么在命令行直接输入他下面的文件就能找到&#xff0c;不用输入完整路径 2.过程 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;建项目 在终端&#xff1a; &#xff08;…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

Linux网络设置

将Linux主机接入到网络&#xff0c;需要配置网络相关设置 一般包括&#xff1a;主机名&#xff1b;IP/netmask&#xff1b;路由&#xff1a;默认网关&#xff1b;DNS服务器&#xff1a;主DNS服务器&#xff0c;次DNS服务器&#xff0c;第三个DNS服务器 网卡的配置文件在&…

java:观察者模式

java&#xff1a;观察者模式 1 前言 观察者模式&#xff0c;又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;他定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所…

百面算法工程师 | 卷积基础知识——Convolution

目录 8.1 图像卷积过程 8.2 卷积层基本参数 8.3 卷积后图像的长和宽大小的计算方式 8.4 卷积神经网络中的权重共享 8.5 上采样中的反卷积 8.6 空洞卷积 8.7 深度可分离卷积 8.8 为什么可分离卷积中Depthwise卷积后还要进行pointwise卷积 8.9 分组卷积 Group Conv 8.1…

AI视频教程下载:ChatGPT个人生产力提升指南

在本课程中&#xff0c;您将学习如何成功地将ChatGPT融入您的工作和生活&#xff0c;以优化您的社交媒体内容并扩展您的业务。 您将学习如何使用ChatGPT自动创建、校对、总结和翻译文本&#xff0c;以及如何与机器人沟通以实现您的目标。 您还将学习如何创建jQuery代码、编程…

倪海厦是怎么去思考问题的(一)下

1《天纪》是自然法则 2自然法则是个《真理》 3《真理》不需要再证实 4《真理》没有二元对立 紧接着第三点&#xff1a;真理不需要再去证实。现在有很多的人呢&#xff0c;看书学习&#xff0c;自认为自己很聪明&#xff0c;总要去证实一些东西。证明谁的说法是错的&#xff…

麒麟龙芯loongarch64 electron 打包deb包

在麒麟龙芯&#xff08;loongarch64&#xff09;电脑上 使用electron 开发桌面应用。之前用electron-packager 打包出来的是文件夹 是 unpack 包。现在需要打包deb包&#xff0c;依据开发指南开始打包。 在项目文件夹下 打开终端 输入 npm run packager 先打包unpack包 然后…

ATFX汇市:澳大利亚一季度CPI年率大降,澳元升值态势延续

▲ATFX图 据澳大利亚统计局数据&#xff0c;第一季度CPI年率最新值3.6%&#xff0c;相比前值4.1%大降0.5个百分点&#xff0c;但仍高于3.5%的预期值。历史数据看&#xff0c;自从2022年四季度创出7.8%阶段性高点之后&#xff0c;澳大利亚的季度CPI年率就保持着稳定的下降态势。…

翻译《The Old New Thing》 - Why are HANDLE return values so inconsistent?

Why are HANDLE return values so inconsistent? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040302-00/?p40443 Raymond Chen 2004年01月27日 简介 在处理 Windows 编程中的句柄时&#xff0c;开发者需要面对的一个挑战是不同函数可…

SWCTF

easy_php 源码 <?php// flag is in flag.php highlight_file(__FILE__); ini_set(display_errors, 0); error_reporting(0);if (isset($_GET[myon1]) && isset($_GET[myon2]) && isset($_GET[myon3])) {$myon1 $_GET[myon1];$myon2 $_GET[myon2];$myon…

苍穹外卖day12 (Apache POI) 数据统计-Excel报表

文章目录 前言一、工作台1.1 今日数据1.1.1 接口设计1.1.2 代码实现 1.2 订单管理接口1.3菜品总览接口1.4 套餐总览接口1.5 订单搜索&#xff08;已完成&#xff09;1.6 各个状态的订单数量统计&#xff08;已完成&#xff09; 二、Apache POI2.1 概述2.2 效果展示 三、导出运营…

vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

一、ffmpeg安装​​​​​​ ffmpeg下载 https://ffmpeg.org/download.html找ffmpeg-release-essentials.zip点击下载&#xff0c;下载完解压ffmpeg.exe 程序运行 二、配置ffmpeg环境变量 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 三、node…

未来五十年,智能科技将如何改变传统行业格局?

未来五十年内&#xff0c;随着人工智能&#xff08;AI&#xff09;和智能科技的不断发展&#xff0c;许多行业将面临被取代的风险。虽然这种趋势可能会带来一些担忧&#xff0c;但也将为人类社会带来巨大的变革。下面将详细探讨哪些行业可能会在未来被智能科技所取代。 ▶ 制造…

利用弹性云主机部署高效数据库系统

在当今云计算的时代&#xff0c;弹性云主机&#xff08;EC2&#xff09;为我们提供了前所未有的灵活性和可扩展性&#xff0c;使得在云端部署高效的数据库系统成为可能。本文将从选择适当的云服务配置、优化数据库设置、建立完备的数据备份与恢复策略&#xff0c;以及加强数据库…

ardupilot开发 --- Jetson Orin Nano 篇

多情应笑我早生华发 0. 一些概念1. 系统安装&#xff08;刷机、flash&#xff09;1.1 使用SD卡安装系统1.2 使用固态硬盘安装系统 0. 一些概念 官网&#xff1a;https://www.nvidia.com/en-us/ Developers Documentation Getting Started Jetson Developer Kits User Guid…