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