6308: 和为给定数 二分

描述

 

给出若干个整数,询问其中是否有一对数的和等于给定的数。

 

输入

 

第一行是整数n(0 < n ≤ 100,000),表示有n个整数。

第二行是n个整数。整数的范围是在0到108之间。

第三行是一个整数m(0≤m≤230),表示需要得到的和。

 

 

输出

 

若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。

 

样例输入

 

4
2 5 1 4
6

样例输出

 1 5
 
似乎对二分有个误区,正确的二分代码应该是当中间数 a[mid] >= 给定数x时,我们用右区间r直接等于mid,另一个则缩小左区间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10,inf = 0x3f3f3f3f;
int a[N];
int find(int x,int l,int r)
{
    while(l<r)
    {
        int mid = (l+r) / 2;
        if(a[mid] >= x)r = mid;
        else l = mid + 1;
    }
    return r;
}
int main()
{
    ll n,m;
    cin >> n;
    for(int i = 1;i <= n;i++)
        scanf("%d",&a[i]);
    cin >> m;
    sort(a + 1, a + 1 + n);
    int f = 0;
    for(int i = 1;i < n;i++)
    {
        int id = find(m - a[i],i,n);
        if(a[id] == m - a[i] && id != i)
        {
            printf("%d %d\n",a[i],a[id]);
            return 0;
        }
    }
    cout << "No";
     return 0;
}

 

posted @ 2023-08-22 15:14  CRt0729  阅读(36)  评论(0编辑  收藏  举报