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;
}