题目还是比较好理解的,就是从输入的数据里面找两个值,使得这两个数的和为给定的数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了。
所以二分一定要记得定义指针啊(这不是指针,但是作用差不多,别杠),不要忘记!!!