3 solutions

  • 1
    @ 2025-3-8 14:03:27

    手敲二分

    #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
      @ 2025-3-7 13:57:11
      #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
        @ 2025-3-7 13:48:16
        #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