2019网易笔试题C++--丰收

题目描述

又到了丰收的季节,恰好小易去牛牛的果园里游玩。 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果园里有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 }
 

猜你喜欢

转载自www.cnblogs.com/gousheng/p/9461953.html