上海计算机学会2025年8月月赛C++丙组T3 最小的差

最小的差

时间限制:1000 ms
内存限制:256 MB

问题描述

给定两个序列 a1,…,ana_1,\dots,a_na1,,anb1,…,bmb_1,\dots,b_mb1,,bm ,从这两序列中,各出一个数字,其中较大的数减去较小的数得到一个差。请输出可以得到的最小的差。

输入格式

  • 第一行:两个整数 nnnmmm
  • 第二行: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 101n,m10
  • 对于 60%60\%60% 的数据,1≤n,m≤20001\leq n,m\leq 20001n,m2000
  • 对于 100%100\%100% 的数据,1≤n,m≤300,0001\leq n,m\leq 300,0001n,m300,000
  • 0≤ai,bj≤1090\leq a_i, b_j\leq 10^90ai,bj109

样例

样例输入

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长春高老师信奥工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值