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