题目描述
又到了丰收的季节,恰好小易去牛牛的果园里游玩。 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。 牛牛觉得问题太简单了,所以希望你来替他回答。
输入描述:
第一行一个数n(1<=n<=10^5) 第二行n个数ai(1<=ai<=1000),表示从左往右数第i堆有多少苹果 第三行一个数m(1<=m<=10^5),表示有m次询问 第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
输出描述:
m行,第i行输出第qi个苹果属于哪一堆。
输入例子1:
5
2 7 3 4 9
3
1 25 11
输出例子1:
1 5 3
该题的解题思路:求累加和,在累加和中查找,如果采用暴力查找只能通过30%的测试用例,时间复杂度太高,查找的时候可以使用二分查找!
代码:
1 //2018年8月11日15:55:16-丰收-采用二分查找就可以了-但是要注意边界条件 2 3 #include <iostream> 4 using namespace std; 5 6 int main() { 7 int n; 8 cin >> n; 9 int a[n]; 10 for (int i = 0; i < n; ++i) { 11 cin >> a[i]; 12 } 13 int m; 14 cin >> m; 15 int q[m]; 16 for (int i = 0; i < m; ++i) { 17 cin >> q[i]; 18 } 19 20 int sum[n]; 21 int res[m]; 22 sum[0] = a[0]; 23 for (int i = 1; i < n; ++i) { 24 sum[i] = sum[i - 1] + a[i]; 25 } 26 for (int i = 0; i < m; ++i) { 27 int j = 0, k = n - 1; 28 while (j < k) { 29 int mid = (j + k) / 2; 30 if (q[i] > sum[mid]) { 31 j = mid + 1; 32 } else{ 33 k = mid; 34 } 35 } 36 res[i] = k + 1; 37 } 38 39 //输出 40 for(int i = 0; i < m; ++i) { 41 cout << res[i] << endl; 42 } 43 return 0; 44 }