当前位置: 首页 > 后端技术 > Python

AtCoderContextABC130DEnoughArray(足够长的数组)

时间:2023-03-26 12:36:40 Python

运行时间限制:2sec内存限制:1024MB原标题链接D-EnoughArray标题有一个整数数组A=a1,a2,a3,...,an和整数K。数组A中有多少个连续区间满足以下条件。连续区间之和必须大于等于K*对于两个区间,即使元素值相同,如果元素的位置不同,这样的区间也被视为两个不同的区间。输出值可能无法按32位加载。要求1<=ai<=1000001<=N<=10000001<=K<=10000输入和输入均按照以下条件从命令行输入NKa1a2a3...aN输出输出连续区间的个数满足条件例1input4106127output2A[1..4]a1,a2,a3,a4(连续区间之和为16)A[2..4]a2,a3,a4(连续区间之和为10)满足条件连续区间数为2例2输入35333输出3对于两个区间,即使元素值相同,但元素的位置是不同,因此将间隔视为两个不同的间隔。例3输入10534621033532223234221099900001884390103522119352输出36解题思路阅读理解题目1.简单来说就是求一个数组中的连续区间,连续区间之和应该是小于给定值。1、找区间就是找数组中的两个点。2.我的直觉可以告诉我,如果找到一个大于等于K的区间,就需要遍历到最后,反之,如果找到一个小于K的区间,只需要遍历一部分即可(见这个我做完就明白了)3、对于一个长度为N的数组,有n(n-1)/2种情况,两点的所有组合都被取出来了。这里以N=4为例,一共有(4(4-1))/2=6种情况4。最后的结果是step3减去step2的值,即两个的情况的个数取出元素-总和小于K的区间个数5.方法1.遍历每一个元素,以遍历到的元素为开始,查找后面的值,直到区间的值大于等于K.在这种情况下,循环在循环内部。因为N的最大值是10的5次方,所以将循环包裹在这样的循环中很复杂。度数是O(N2)时间不允许,我第一次提交直接TLE。2.标尺法(日文),双指针算法这种情况下,复杂度只有O(N),时间允许。那么我们以例1为例代码S=input().split("")n=int(S[0])k=int(S[1])S=input().split()arr=[int(s)forsinS]defcalculate(n,k,arr):j=0s=0ans=0foriinrange(n):while(j