二分
二分查找
用于有规律的数列对数的查找
二分的暴力解法
int find(int temp)
{
int l=1,r=n;
while (l<r)
{
int mid=l+(r-l)/2;
if (a[mid]>=temp) r=mid;
else l=mid+1;
}
if (a[l]==x) return l;
else return -1;
}
那就只能用
STL自带的二分函数——upper_bound和lower_bound。这两个函数的作用是二分查找一个数在数组中出现的位置。区别是
upper返回第一个大于搜索数的位置,而lower是第一个大于等于的数的位置。
lower_bound(a.begin(),a.end(),x);
//手写
int lower_bound(int temp)
{
int l=0,r=n+1;
while(l+1<r)
{
int mid=l+(r-l)/2;
if(a[mid]>=temp)
r=mid;
else
l=mid;
}
return r;
}
//注意返回的是地址
int temp=lower_bound(a.begin(),a.end(),x)-a;
int lower_bound(int temp)
{
int l=0,r=n+1;
while(l+1<r)
{
int mid=l+(r-l)/2;
if(a[mid]<=temp)
l=mid;
else
r=mid;
}
return r;
}
可以用桶
或者更好的用
STL中的map
map<int.int> ma;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(!ma[a[i]])//判断只记录第一个
ma[a[i]]=i;
}
二分求解方程解
对于解的区间在【-100~100】之间的解,且两个解的差绝对值大于1,可采用二分暴力枚举
double f(double a,double b,double c)
{
return a*x*x+b*x+c;
}
//主函数
cin>>a>>b>>c;
double l,r,x1,x2;
if(x1)
for(int i=-100;i<100;i++)
{
x1=f(l);
x2=f(r);
int s=0;
if(!x1)
{
s++;
cout << fixed << setprecision(2) << l<<" ";
}
if(x1*x2<0)
{
while(r-l>=0.001)
{
double mid=(l+r)/2;
if(f(mid)*f(r)<=0)
l=mid;
else
r=mid;
}
cout << fixed << setprecision(2) << l<<" ";
}
if(s==2)
break;
}

浙公网安备 33010602011771号