链接:https://www.nowcoder.com/questionTerminal/83b419c027fa490aa60669b0e7dc06a3
来源:牛客网
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
输入描述:
第一行一个数n(1 <= n <= 105)。 第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果 第三行一个数m(1 <= m <= 105),表示有m次询问。 第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
输出描述:
m行,第i行输出第qi个苹果属于哪一堆。
示例1
输入
5 2 7 3 4 9 3 1 25 11
输出
1 5 3
解题思路:依次累加求出每个堆和前几个堆的总和
暴力解法是再循环一遍 每次判断询问的苹果 是不是比 总和小
用二分法替换暴力解法,最后求出的l是要+1,注意h是可能等于m的
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
nums[0] = sc.nextInt();
for(int i = 1;i < n; i++){
nums[i] = nums[i - 1] + sc.nextInt();
}
int query = sc.nextInt();
for(int i = 0; i < query; i++){
int num = sc.nextInt();
int l = 0, h = n - 1;
while(l < h){
int m = l + (h - l) / 2;
if(nums[m] < num){
l = m + 1;
}else{
h = m;
}
}
System.out.println(l+1);
}
}
}