题目描述
有两个从小到大排好序的序号a和b,长度均为n。
要求选择两个数i、j,满足a[i]+b[j]<=m的情况令a[i]+b[j]尽可能大。输出a[i]+b[j]的最大值
输入
输入一个正整数n、m,表示数组的长度、m如上面题面所说 。
第2行输入a数组。
第3行输入b数组。
输出
输出答案。
样例输入
4 10 1 3 5 9 2 8 9 10
样例输出
10
提示
100%的数据满足:1 ≤ n ≤ 1,000,000.
所有数保证大小∈[1,1000000000].
分析:以为题目有两个数组,并且数据较大,所以我们首先想到的就是用二分。我们可以第一个用for循环搜索,第二个数组用二分来找。代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll a[maxn],b[maxn];
int main()
{
ll n,k;
ll x,y,z,p;
scanf("%lld%lld",&n,&k);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++)
scanf("%lld",&b[i]);
ll sum=0;
ll l=1,r=n;
for(ll i=1;i<=n;i++)
{
l=1;r=n;
while(l<=r)
{
ll w;
w=(l+r)/2;
if(a[i]+b[w]<=k)
{
ll num=a[i]+b[w];
if(sum<num)
sum=num;
l=w+1;
}
else
{
r=w-1;
}
}
}
printf("%lld\n",sum);
return 0;
}
加油!!!