上海市计算机学会竞赛平台2024年1月月赛丙组最大的和

题目描述

给定两个序列 𝑎1,𝑎2,...,𝑎𝑛a1​,a2​,...,an​ 与 𝑏1,𝑏2,...,𝑏𝑛b1​,b2​,...,bn​,请从这两个序列中分别各找一个数,要求这两个数的差不超过给定的数字 𝑑d,且两个数字之和最大

输入格式
  • 第一行:两个整数 𝑛n 与 𝑑d;
  • 第二行:𝑛n 个整数 𝑎1,𝑎2,...,𝑎𝑛a1,a2,...,an;
  • 第三行:𝑛n 个整数 𝑏1,𝑏2,...,𝑏𝑛b1,b2,...,bn;
输出格式
  • 单个整数:两个数的最大和。若没有合适的方案输出 None
数据范围
  • 对于 30%30% 的数据,1≤𝑛≤2001≤n≤200;
  • 对于 60%60% 的数据,1≤𝑛≤200001≤n≤20000;
  • 对于 100%100% 的数据,1≤𝑛≤200001≤n≤20000,1≤𝑑≤1091≤d≤109,1≤𝑎𝑖,𝑏𝑖≤1091≤ai,bi≤109。
样例数据

输入:

3 2

3 1 4

1 5 9

输出:

9

说明:

4+5

详见代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
long long a[200005];
long long b[200005];
long long d;
long long ans=0;
int main()
{
    cin>>n>>d;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
    }
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    int bp=1;
    for(int i=1;i<=n;i++)
    {
        while((b[bp]<a[i]||b[bp]-a[i]<=d)&&bp<=n)
        {
            bp++;
        }
        if (b[bp-1]>=a[i]&&bp-1<=n&&b[bp-1]-a[i]<=d)
        {
            ans=max(ans,a[i]+b[bp-1]);
        }
    }
    int ap=1;
    for(int i=1;i<=n;i++)
    {
        while((a[ap]<b[i]||a[ap]-b[i]<=d)&&ap<=n)
        {
            ap++;
        }
        if (a[ap-1]>=b[i]&&ap-1<=n&&a[ap-1]-b[i]<=d)
        {
            ans=max(ans,b[i]+a[ap-1]);
        }
    }
    if (ans==0)
    {
        cout<<"None";
    }
    else
    {
        cout<<ans;
    }
    return 0;
}
相关推荐
此生只爱蛋7 分钟前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp15 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客37 分钟前
基础数据结构——队列(链表实现)
数据结构
咕咕吖39 分钟前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!2 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
为什么这亚子3 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
3 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习