打怪兽

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

 

全部评论

相关推荐

09-22 22:22
中山大学 Java
乌鱼子萨奇:羡慕你啊,直接转正了,都不用经历秋招的炼狱,但是你少经历了很多痛苦的事情啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务