倍增入门水题

给定一个长度为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 }

 

G102的孤儿们都要好好的啊。
原文地址:https://www.cnblogs.com/ve-2021/p/9515603.html