標籤:clu 複雜 lock end size 網易筆試題 一個 -- 條件
題目描述
又到了豐收的季節,恰好小易去牛牛的果園裡遊玩。 牛牛常說他多整個果園的每個地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果園裡有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:
52 7 3 4 931 25 11
輸出例子1:
153
該題的解題思路:求累加和,在累加和中尋找,如果採用暴力尋找只能通過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++--豐收