二分 by zzt

#include <bits/stdc++.h>
using namespace std;

/*
 Problem description:
 There is an array A, the length of array A is N.
 You need to perform Q queries.
 Each query, you get an integer X, and you need to find the smallest integer Y in array A, meet Y > X.
 If there exist such integer, please print the value of the integer.
 Otherwise, please print "There is no number bigger than X".
 
 If you finish the above problem, please try the following problem:
 1. Find the biggest integer Y in array A, Y < X.
 2. Validate if there is a integer Y in array A, meet Y equals to X.
 
 最后写这些:(key 就是上文中每次输入的 X)
 1. 对于不下降序列 a,求最小的 i,使得 a[i] = key
 2. 对于不下降序列 a,求最大的 i,使得 a[i] = key
 3. 对于不下降序列 a,求最小的 i,使得 a[i] > key
 4. 对于不下降序列 a,求最大的 i,使得 a[i] < key
 5. 对于不上升序列 a,求最小的 i,使得 a[i] = key
 6. 对于不上升序列 a,求最大的 i,使得 a[i] = key
 7. 对于不上升序列 a,求最小的 i,使得 a[i] < key
 8. 对于不上升序列 a,求最大的 i,使得 a[i] > key
 
 */

const int maxn = 1e5 + 10;
int n, q;
long long a[maxn];

int main() {
  scanf("%d", &n);
  for(int i = 1; i <= n; i ++) {
    scanf("%lld", &a[i]);
  }
  sort(a + 1, a + 1 + n);
  
  scanf("%d", &q);
  while(q --) {
    long long x;
    scanf("%lld", &x);
    int L = 1, R = n, pos = -1;
    while(L <= R) {
      int mid = (L + R) / 2;
      if(a[mid] <= x) L = mid + 1;
      else R = mid - 1, pos = mid;
    }
    if(pos == -1) printf("There is no number bigger than %lld", x);
    else printf("%lld
", a[pos]);
  }
  
  return 0;
}

  

原文地址:https://www.cnblogs.com/zlrrrr/p/9992023.html