题目
给定一个数列,共有n个正数,现在有m次询问,每次询问给出一个t,求满足最小的k使得从第一个数到第k个数之和小于等于t;
解题思路
先预处理前缀和,然后倍增着去找小于t的最大序列和,
代码如下
//倍增
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn =1e5+10;
int n,m;
int a[maxn];
int main()
{
cin >>n>>m;
for(int i=1;i<=n;i++)
{
cin >>a[i];
a[i] += a[i-1];
}
while(m--)
{
int t;
cin >>t;
int k=0,p=1;
while(p)
{
if(k+p>n)break;
if(a[k+p] <= t)k+=p,p*=2;
else p/=2;
}
cout <<k<<endl;
}
return 0;
}