#include<iostream> using namespace std; int arr[100010]; int main() { int n; cin >> n; int i; for (i = 1; i <= n; i++) { cin >> arr[i]; //输入非降序列 } int m; cin >> m; while (m--) //输入x { int flag = 0; //标志变量 int k; //x(不小心设成了k),以下k均代表x cin >> k; //二分查找k int left = 1, right = n; while (left + 1 < right) { int mid = (left + right) / 2; //如果找到k,那么标志变量变成1,退出查找找,与x最接近的就是查找到的这个数 if (arr[mid] == k) { flag = 1; break; } if (arr[mid] < k) left = mid; else right = mid; } // 在序列中查找到k if (flag) cout << k << endl; //未查找到k的话,判断此时arr[left]-k和arr[left+1]-k哪个小,输出较小的那个 else if (abs(arr[left] - k) <= abs(arr[left + 1] - k)) cout << arr[left] << endl; else cout << arr[left + 1] << endl; } return 0; }
标签:arr,right,不降,P1747,mid,int,查找,单调,left From: https://www.cnblogs.com/lhf123/p/17425226.html