2024寒假算法基础训练营6

思路及代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a,b,c;//将大型数组声明为全局,防止堆栈溢出(段错误)
void solve(){
    int n;
    cin>>n;
    a.resize(n);
    b.resize(n);
    c.resize(n);
    for( ll & ai:a){cin>>ai;}
    for( int i=0;i<n;i++){cin>>b[i]; c[i]=b[i];}
    sort(a.begin(),a.end());
    sort(c.begin(),c.end());
    int  ans = INT_MAX,ida,idb, ta,tb;
    for( int i=0,j=0; i<n&&j<n;){//采用双指针法定位绝对值最小的一对数的位置
        auto diff = abs(a[i]-c[j]);
        if(diff<ans){
            ans =diff;
            ida =a[i];
            idb = c[j];
        }
        if(a[i]<c[j]){i++;}
        else{j++;}
        
    }
    //从a和b数组中找到相应的距离最近的一对数的索引
    
//     for( int i=0;i<n;i++){
//         if(a[i]==ida){ ta = i; }
//     }
//     for( int i=0;i<n;i++){
//         if( b[i]==idb){tb = i;}
//     }
    ta = find(a.begin(),a.end(),ida)-a.begin();
    tb = find(b.begin(),b.end(),idb)-b.begin();
    swap(a[ta],a[tb]);
    for( auto&ai : a){
        cout<<ai<<" ";
    }
    cout<<endl;
    
}
int main(){
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    solve();
    return 0;
}