01 #include<iostream> 02 03 using namespace std; 04 const int maxn = 100000; 05 int a[maxn], b[maxn], n; 06 int Search(int num, int low, int high) { 07 int mid; 08 while (low <= high) { 09 mid = (low + high) / 2; 10 if (num >= b[mid]) low = mid + 1; 11 else high = mid - 1; 12 } 13 return low; 14 } 15 int main() { 16 int len, pos; 17 cin >> n; 18 for (int i = 1; i <= n; i++) 19 cin >> a[i]; 20 b[1] = a[1]; 21 len = 1; 22 for (int i = 2; i <= n; i++) { 23 if (a[i] >= b[len]) { 24 len++; 25 b[len] = a[i]; 26 } else { 27 pos = Search(a[i], 1, len); 28 b[pos] = a[i]; 29 } 30 } 31 cout << len << endl; 32 return 0; 33 }
1. 输入的 a[i] 必须在 [1,n] 范围内。( )
2. 把第 10 行的 mid + 1 改成 mid 不影响程序运行结果。( )
3. 当数组 a 单调不降时输出为 1 。( )
4. 数组 b 内的元素始终单调不降。( )
5. 当输入第一行为 20 ,第二行为 1 20 2 19 3 18 4 17...9 12 10 11 时,输出为( )
6. 算法的时间复杂度为( )