最小的差
时间限制:1000 ms
内存限制:256 MB
问题描述
给定两个序列 a1,…,ana_1,\dots,a_na1,…,an 与 b1,…,bmb_1,\dots,b_mb1,…,bm ,从这两序列中,各出一个数字,其中较大的数减去较小的数得到一个差。请输出可以得到的最小的差。
输入格式
- 第一行:两个整数 nnn 与 mmm
- 第二行:nnn 个整数表示 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an
- 第三行:mmm 个整数表示 b1,b2,…,bmb_1,b_2,\dots,b_mb1,b2,…,bm
输出格式
单个整数:表示其中最小的差。
数据范围
- 对于 30%30\%30% 的数据,1≤n,m≤101\leq n,m\leq 101≤n,m≤10
- 对于 60%60\%60% 的数据,1≤n,m≤20001\leq n,m\leq 20001≤n,m≤2000
- 对于 100%100\%100% 的数据,1≤n,m≤300,0001\leq n,m\leq 300,0001≤n,m≤300,000
- 0≤ai,bj≤1090\leq a_i, b_j\leq 10^90≤ai,bj≤109
样例
样例输入
2 5
3 7
1 4 8 9 10
样例输出
1
解析
将两个序列合并后排序,遍历比较相邻不同序列元素的差值,取最小值。时间复杂度为O((n+m)log(n+m)),适用于本题数据规模(n,m≤300,000)。
详见代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
int x;//数值
char z;//属于哪个序列
};
node a[600005];
bool cmp(node x,node y){//按数值由小到大排序
return x.x<y.x;
}
int ans=1e9+1;//答案默认取最大值
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){//输入序列a
cin>>a[i].x;
a[i].z='a';
}
for(int i=1;i<=m;i++){//输入序列b
cin>>a[i+n].x;
a[i+n].z='b';
}
sort(a+1,a+n+m+1,cmp);//排序
for(int i=1;i<n+m;i++){
if (a[i].z!=a[i+1].z){//不属于同一序列
ans=min(a[i+1].x-a[i].x,ans);//求最小值
}
}
cout<<ans;
return 0;
}