最近元素/找数
#include <iostream> #include <stdlib.h> using namespace std; const int N = 100000; int a[N]; int search(int left, int right, int key) { int mid; while(left < right) { mid = (left + right) / 2; if(a[mid] > key) right = mid; else left = mid; if(left + 1 == right) { if(abs(key - a[left]) > abs(key - a[right])) left = right; else right = left; } } return left; } int main() { int n, m; cin >> n; for(int i=0; i<n; i++) cin >> a[i]; cin >> m; for(int i=0; i<m; i++) { int temp; cin >> temp; int ans = search(0, n - 1, temp); cout << a[ans] << endl;; } return 0; }
#include <stdio.h> #define N 100000 int a[N]; int find(int left, int right, int x) { int mid; while(left <= right) { mid = (left + right) / 2; if(a[mid] == x) return a[mid]; else if(a[mid] < x) left = mid + 1; else right = mid - 1; } return a[right]; } int main(void) { int n, m, x, i; while(scanf("%d%d", &n, &m) != EOF) { a[0] = -1; for(i=1; i<=n; i++) scanf("%d", &a[i]); for(i=1; i<=m; i++) { scanf("%d", &x); printf("%d\n", find(1, n, x)); } } return 0; }