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;
}