我必须找到未排序数组的两个元素之间的最小绝对差。 我的方法是先对两个数组都进行排序,在一个数组上运行一个循环,然后在另一个数组中找到该数组的每个元素的下限。
然后检查是否为最小值并将其存储以进行进一步比较
测试用例:
2
8 1 3 5 7 9 7 3 1
8 2 4 6 8 10 8 6 2
8 2 3 5 10 9 3 2 1
7 1 2 6 12 13 3 2
输出:
1
0
结果:通过
说明:
1)分钟将为abs(a [7] -b [7])
2)分钟将为abs(a [0] -b [(1)])
但是当我向spoj提交时,我得到了错误的答案,看来我正在丢失其他东西。
问题https://www.spoj.com/problems/ACPC11B/
请帮助我哪里做错了?
我的代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector <int> a;
vector <int> b;
int main(){
int t;
cin>>t;
while(t--){
int na;
cin>>na;
for(int i=0;i<na;i++){
int temp;
cin>>temp;
a.push_back(temp);
}
int nb;
cin>>nb;
for(int i=0;i<nb;i++){
int temp;
cin>>temp;
b.push_back(temp);
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int ans=a[0]-b[0];
for(int i=0;i<a.size();i++){
int bval = lower_bound(b.begin(),b.end(),a[i])-b.begin();
ans = min(ans,abs(a[i]-b[bval]));
if(bval>0)
ans = min(ans,abs(a[i]-b[bval-1]));
}
cout<<ans<<endl;
a.clear();
b.clear();
}
}
答案 0 :(得分:0)
您的版本有几个问题:
a[0]-b[0]
可能为负,使剩余计算无效。b.end()
导致超出限制的访问。您可以执行以下操作:
std::size_t min_distance(std::vector<int> v1, std::vector<int> v2)
{
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
auto it1 = v1.begin();
auto it2 = v2.begin();
auto min = std::abs(*it1 - *it2);
while (min != 0 && it1 != v1.end() && it2 != v2.end()) {
min = std::min(min, std::abs(*it1 - *it2));
if (*it1 < *it2) {
++it1;
} else /*if (*it2 <= *it1)*/ {
++it2;
}
}
return min;
}