关于倍增算法的理解

本文介绍了一种在线查询最大子序列和的算法,利用倍增思想来处理数列A,每次询问给出一个整数T,算法需找出最大的k,使得数列前k项之和不超过T。通过不断调整步长,最终确定满足条件的最大k。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个长度为n的数列A,然后进行若干次询问,每次给定一个整数T,求出最大的k,满足sigama(1<=i<=k)A[i]<=T。你的算法必须是在线的,且T小于这n个数的和。

倍增思想,每次往后枚举2^n倍的数,看是否满足条件,不满足就只往后延伸2^(n-1),再次不满足就再往后除以2的个数延伸......

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int SIZE = 100010;
 4 int n,A[SIZE],s[SIZE],T;
 5 inline void dfs(int &p)
 6 {
 7     if(sum+s[k+p]-s[k]<=T)
 8     {
 9         sum +=s[k+p] - s[k];
10         k += p;
11         dfs(p<<1);
12     }
13     else dfs(p>>1);
14     if(!p) break;
15 }
16 
17 int main()
18 {
19     scanf("%d %d",&n,&p);
20     for(int i = 1;i <= n;i++)
21     {
22         scanf("%d",&A[i]);
23         s[i] = s[i-1] + A[i];
24     }
25     int p(1),k(0),sum(0);
26     dfs(1);
27     printf("%d",k);
28     return 0;
29 }

 

转载于:https://www.cnblogs.com/ve-2021/p/9515603.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值