题目还是比较好理解的,就是从输入的数据里面找两个值,使得这两个数的和为给定的数M,

举例来说,就是

4//输入四个数
2 5 1 4
6//最终给定的和

 如果没有解 就输出No!;

那来看看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define itn int
using namespace std;
int a[100000];//定义一个一维数组 
int main()
{
    int n,m,l,r,mid;//l左指针 r右指针 mid中间数 
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];//输入数据 
    cin>>m;//和 
    sort(a,a+n);//按从小到大排序 
    for(int i=0;i<n;i++)
    {
        l=i;//左 
        r=n;//右 
        while(l<=r)
        {
            mid = (l+r)/2;
            if(a[i]+a[mid]==m)
            {
                cout<<a[i]<<" "<<a[mid];//中间取 二分 
                return 0;
            }
            else if(a[mid]+a[i]>m) r=mid-1;//大于就向左取 
            else l=mid+1;//小于就向右取 
        }
    }
    cout<<"No";//没有结果输出No 
    return 0;
}

  先把这些数字从大到小排列,方便我们的二分,把中间项定义为mid(最左加最右/2)

然后拿最左与mid来相加与m比较 若是大了就mid向左指一个,反之向右指一个。

其中有一个代码,我一开始写的时候没有加上

l=i;//左
        r=n;//右 

  没有明白为什么要这么做

于是第一次交的时候就GG了

后来加上了就AC了。

所以二分一定要记得定义指针啊(这不是指针,但是作用差不多,别杠),不要忘记!!!

 

posted on 2020-05-25 16:14  月下诺  阅读(701)  评论(0编辑  收藏  举报

Live2D