【发布时间】:2019-03-17 18:11:38
【问题描述】:
我必须找到未排序数组的两个元素之间的最小绝对差。 我的方法是首先对两个数组进行排序,在一个数组上运行一个循环,然后在另一个数组中找到该数组的每个元素的下限。
然后检查它是否最小并将其存储起来以供进一步比较
测试用例:
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) min 为 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();
}
}
【问题讨论】:
-
如果您要发布在线裁判比赛代码,您应该首先摆脱所有这些输入语句,而是将数据硬编码到程序中。当他们试图运行您的代码时,没有人会坐在那里一遍又一遍地输入数据。
-
您的代码无法产生您描述的输出。
-
@PaulMcKenzie 你是对的,当然,但我承认他在作弊,我给予 OP 信用。 /s
-
@OP This is an example。无需反复输入数据,代码测试方便。
-
int ans=a[0]-b[0];应该是int ans=std::abs(a[0]-b[0]);