1244:和为给定数

时间:2020-05-25
本文章向大家介绍1244:和为给定数,主要包括1244:和为给定数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目还是比较好理解的,就是从输入的数据里面找两个值,使得这两个数的和为给定的数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了。

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

原文地址:https://www.cnblogs.com/--840-114/p/12957514.html