题目:C - Min Difference
Time Limit: 2 sec / Memory Limit: 1024 MB
https://atcoder.jp/contests/abc212/tasks/abc212_c
Problem Statement/问题陈述
简要翻译:给定两个数列A和B,A的长度为N,B的长度为M。现任从A、B中各任取一数字作差的绝对值,求该差的绝对值的最小值。
Constraints/数据范围
显然这个数据范围如果直接用M*N所有情况都枚举一下肯定是会超时的。
IO/输入输出格式
样例
输入:
2 2
1 6
4 9
输出:
2
说明:
|1-4|=3 |1-9|=8
|6-4|=2 |6-9|=3
其中的最小值为2
解
要取得最小的差,显然作差的两个数要足够相近。不难证明,最小的差在两个数最相近时取得。
那么,如何取得最相近的情况呢?
其实很简单,把A的所有元素和B的所有元素打上标签扔进一个数组里排序,然后从左往右把相邻的标签不同的数字的差的绝对值作为答案记录,并找到其最小值。
以上。
#include <bits/stdc++.h>
using namespace std;
int n, m;
struct node
{
int num; //数值
int co; //来自哪个数组,1为A,-1为B
} e[3000000];
int ans;
int la,lb;
bool cmp(node a,node b)
{
return a.num<b.num;
}
int main()
{
la=-(1<<30); //上一个来自A的数
ans=1<<30; //所求差的绝对值的最小值
lb=la; //上一个来自B的数
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &e[i].num);
e[i].co=1;
}
for (int i = 1; i <= m; i++)
{
scanf("%d", &e[n+i].num);
e[n+i].co=-1;
}
sort(e+1,e+1+m+n,cmp); //排序
for (int i = 1; i <= m+n; i++)
{
if(e[i].co==1)
{
la=e[i].num;
ans=min(ans,abs(e[i].num-lb));
}
if(e[i].co==-1)
{
lb=e[i].num;
ans=min(ans,abs(e[i].num-la));
}
}
cout << ans << endl;
return 0;
}