二分找答案,用一个前缀和,不然会超时x
要注意的地方:
1.什么时候右边界收缩,什么时候左边界收缩。
2.找到答案时,l,r区间不存在,答案出现在l处,即r+1处。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[50009];
long long sum[50009];
long long n , m , q;
bool check(int ans)
{
long long temp = 0;
/*for(int i = 1;i <= ans;i++)
{
temp += a[i];
if(temp > q)break;
}*/
temp += sum [ans];
return temp > q;
}
int main()
{
cin>> n >> m;
for(int i = 1;i <= n;i++)
cin>>a[i],sum[i] = sum[i - 1] + a[i];
while( m-- )
{
cin >> q;
int l = 1,r = n, mid;
while( l <= r )
{
mid = (l + r) >> 1;
if( !check(mid) ) l = mid + 1;
else r = mid - 1;
}
cout<< l << "\n";
}
return 0;
}
京公网安备 11010502036488号