#include using namespace std; int n, m, a[10000] = {-1}; int main() { //输入+输出重定向 freopen("../1305.txt", "r", stdin); //录入数据 cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } //m个询问 for (int i = 1; i <= m; i++) { int x; cin >> x; int left = 1, right = n, mid; /* 用left表示序列的左边界,用right表示序列的右边界,[left,right]组成序列。 一开始left=1,right=n。序列已经按照升序排好,保证了二分的有序性。 二分法 二分的步骤: 1.去序列区间的中间值mid=(left+right)/2; 2.判断mid与x的关系,如果a[mid]>x,所以区间[mid,right]直接排除,修改right=mid-1;如果a[mid]<=x,所以区间[left,mid]直接排除,修改right=mid+1; 3.重复执行二分操作直到left>right。最终循环结束时一定是left=right+1,所以最后的结果为right指向的值。 4.如果在序列中找不到合适的位置,或者说是在最前面添加上的话,那么right=0,需要将a[0]设置为-1. */ while (left <= right) { //注意是小于等于 mid = (left + right) / 2; //取中间值 if (a[mid] <= x) { left = mid + 1; //在右边,则left修改为mid+1 } else { //在左边,则right修改为mid-1 right = mid - 1; } } //cout << "left=" << left << ",right=" << right << endl; cout << a[right] << endl; } //关闭文件 fclose(stdin); return 0; }