2019網易筆試題C++--豐收
阿新 • • 發佈:2018-08-12
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 (inti = 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++--豐收