1. 程式人生 > >2019網易筆試題C++--豐收

2019網易筆試題C++--豐收

block 一行 思路 使用 屬於 如果 簡單 代碼 for

題目描述

又到了豐收的季節,恰好小易去牛牛的果園裏遊玩。 牛牛常說他多整個果園的每個地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果園裏有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 }

 

2019網易筆試題C++--豐收