3 solutions
-
1
手敲二分
#include<cstdio> #include<cmath> #define N 100001 int a[N],n,m,v; int nearer_bound(int a[],int l,int r,int v) //拿lower_bound改的 { int mid; while(l<r) { mid=l+(r-l)/2; if(a[mid]>=v) r=mid; else l=mid+1; } return l && abs(a[l]-v) >= abs(a[l-1]-v) ? a[l-1] : a[l];//注意!一定要返回尽量小的元素! } int main() { scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&a[i]); scanf("%d",&m); while(m--) { scanf("%d",&v); printf("%d\n",nearer_bound(a,0,n-1,v)); } return 0; }
-
1
#include<bits/stdc++.h> using namespace std; int n; int a[1000010]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int m; cin>>m; while(m--){ int x; cin>>x; int u=lower_bound(a+1,a+1+n,x)-a;//查找>=x的数的位置 //作者博客中有详细介绍lower_bound if(u==n+1){//不存在时 cout<<a[u-1]<<'\n'; }else if(u==1){ cout<<a[u]<<'\n'; }else{ if(a[u]==x){ cout<<a[u]<<'\n'; }else if(abs(a[u-1]-x)<=abs(a[u]-x)){ cout<<a[u-1]<<'\n'; }else{ cout<<a[u]<<'\n'; } } } return 0; }
-
1
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxs=1e6+10; int n; ll a[maxs],num=0; ll jiejin(ll b){ ll l=0,r=n-1; if(b<=a[l]){ return a[l]; } if(b>=a[r]){ return a[r]; } //ll m=(l+r)/2;//放这里的时候进入循环m不会更新h_h 被卡了好久555 while(r-l>1){ // if(b<a[m]){ // r=m; // } ll m=(l+r)/2; if(b>=a[m]){ //r=m; l=m; } else{ r=m; } } if(abs(a[l]-b)<=abs(a[r]-b)){ return a[l]; } return a[r]; } signed main(){ ll x,s; cin>>n; for(ll i=0;i<n;i++){ cin>>a[i]; } cin>>x;; for(ll i=0;i<x;i++){ cin>>s; cout<<jiejin(s)<<endl; // b[++num]=jiejin(s); } // sort(b,b+num,greater<int>()); // for(int i=0;i<num;i++){ // cout<<b[i]<<endl; // } return 0; }
- 1
Information
- ID
- 725
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 78
- Accepted
- 11
- Uploaded By