Description

树林里有n 个怪兽,杀死第i 个怪兽会消耗猎人ai 的血量。当猎人的血量大于杀死怪兽需要消耗的血量,猎人可以击败怪兽,并减去相应血量。树林外有m 个有自知之明的猎人,他们每个人都有一个初始血量,并按顺序去杀死怪兽(杀死第一个,然后杀死第二个,然后第三个....),因外他们有自知之明,所以他们想知道自己可以击败前几个怪兽,请你告诉他们。
注意:因为需要输入输出的数据比较多,请不要使用cin,cout(使用scanf,printf)。

Input

第一行一个数T(T<=5) ,代表输入数据的组数。
每组数据第一行有两个整数n,m(n,m<=100,000) ,代表怪兽的数量和猎人的数量。
第二行有n 个整数,第i 个整数ai(1<=ai<=10000) 代表杀死第i 个怪物消耗的血量。

接下来有m 行,每行一个整数代表这个猎人的初始血量c(1<=c<=1000,000,000 )。

Output

对每组数据输出m 行,每行一个数代表每个猎人能够击败前几个怪兽。

Sample Input

1 4 2 3 5 8 5 4 10

Sample Output

1 2

题解:

这题要二分查找

首先用数组存储前i项和

然后存储和的数组必定有序

可以用二分查找找到答案

 

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
int t,n,m;
using namespace std;
long long  a[200000],c,b[200000],sum=0;
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        sum=0;
        for(int i=1;i<=n;i++){
             scanf("%lld",&a[i]);
             sum+=a[i];
            b[i]=sum;
        }
        for(int i=1;i<=m;i++){
             scanf("%lld",&c);
                //二分查找
             cout << lower_bound(b+1,b+n+1,c)-b-1 << endl;
        }

    }
    //cout << "Hello world!" << endl;
    return 0;
}