题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
输入描述:
第一行一个数n(1 <= n <= 105)。 第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果 第三行一个数m(1 <= m <= 105),表示有m次询问。 第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
输出描述:
m行,第i行输出第qi个苹果属于哪一堆。
输入
5 2 7 3 4 9 3 1 25 11
输出
1
5
3
分析
一个二分实现;
首先,在输入每堆的个数的时候,就加起来,每个位置放的是,前面所有苹果的和再加上自己的和;
然后,就通过二分实现;
- 小于:还要判断该堆是不是大于q[i]最小的堆;所以要和a[mid-1]进行判断一下,如果>a[mid-1],那么该位置就是,如果<a[mid-1],那么就得在前面找;
- 大于:就直接往后找;
- 等于:就直接输出;
代码
import java.util.Scanner; public class Harvest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] = new int[n]; int sum = 0; a[0] = sc.nextInt();//每堆苹果的个数 for(int i = 1;i < n;i++){ a[i] = sc.nextInt()+a[i-1];//每堆苹果的个数 } int m = sc.nextInt(); int q[] = new int[m]; for(int i = 0;i < q.length;i++){ q[i] = sc.nextInt();//想要看的苹果数 //一个简单的二分 } for(int i = 0;i < q.length;i++){ int left = 0,right = a.length-1; while (left <= right){ int mid = (left + right) >> 1; if(q[i] < a[mid]){ if((mid-1) >= 0 && q[i] <= a[mid - 1] ){ right = mid - 1; }else{ System.out.println(mid + 1); break; } } else if(q[i] > a[mid]){ left = mid + 1; } else{ System.out.println(mid+1); break; } } } } }