#mengxiongP8. 完善程序(三)-切割

完善程序(三)-切割

完善程序(三)- 切割

题目描述

(切割) 将一个单调递增的数组从某一位置切成两半,然后交换左半边和右半边。现在给出交换后的数组,多次询问,每次给出一个元素 k,问数组中是否存在该元素。

提示: 先使用二分查找,找到切割点,则切割点左边的数组单调递增,右边的数组单调递增,再对半边数组进行二分查找,寻找元素 k。

#include <iostream>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
bool binary_search(int l, int r, int k) { // 用于实现二分查找,判断 [l,r] 中是否有 k 出现
    while(【1】) {
        int mid = (l + r) >> 1;
        if(a[mid] == k) {
            【2】;
        } else if(a[mid] > k) {
            r = mid;
        } else {
            l = mid;
        }
    }
    return a[l] == k || a[r] == k;
}
int main() {
    int n, m, k;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int L = 1, R = n, pos;
    while(L <= R) {
        int mid = (L + R) / 2;
        if(【3】) {
            L = mid + 1;
            pos = mid;
        } else {
            R = mid - 1;
        }
    }
    cin >> m; // 表示共有 m 次询问
    while(m--) {
        cin >> k;
        if(k >= a[1]) {
            if(【4】)    cout << "YES" << endl;
            else    cout << "NO" << endl;
        } else {
            if(【5】)    cout << "YES" << endl;
            else    cout << "NO" << endl;
        }
    }
}

第 1 题(20 分) 1 处应填:{{ select(1) }}

  • A. l <= r
  • B. l < r
  • C. l + 1 < r
  • D. l >= r

第 2 题(20 分) 2 处应填:{{ select(2) }}

  • A. break
  • B. return true
  • C. l = mid + 1
  • D. r = mid - 1

第 3 题(20 分) 3 处应填:{{ select(3) }}

  • A. a[mid] > k
  • B. mid > k
  • C. a[mid] >= a[1]
  • D. a[mid] > a[1]

第 4 题(20 分) 4 处应填:{{ select(4) }}

  • A. binary_search(L, R, k)
  • B. binary_search(1, pos+1, k)
  • C. binary_search(L, pos, k)
  • D. binary_search(1, pos, k)

第 5 题(20 分) 5 处应填:{{ select(5) }}

  • A. binary_search(pos, R, k)
  • B. binary_search(pos+1, R, k)
  • C. binary_search(pos+1, n, k)
  • D. binary_search(L, R, k)