您的位置:首页 > 其它

STL二分查找的使用

2019-07-29 12:25 78 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40534166/article/details/97633356

STL二分查找

使用对象:有序数组

头文件:algorithm

lower_bound()返回值是一个迭代器,返回指向大于等于key的第一个值的位置
函数参数中的数组边界a,a+8为左开右闭。查找失败返回后一个地址(越界地址)

#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,7,8,9};
printf("%d",lower_bound(a,a+8,6)-a);

return 0;
}

输出:5

将key换成10,所有val都小于key,返回last的位置

#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,7,8,9};
printf("%d",lower_bound(a,a+8,10)-a);

return 0;
}

输出: 8

upper_bound()函数,它返回大于等于key的最后一个元素

例题:CF1077E
AC代码:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 7;

int a[maxn];
map<int, int> mp;

int main()
{
int n;
scanf("%d",&n);
int cnt=0,x;
for(int i=1;i<=n;i++)
{
scanf ("%d",&x);
if(!mp[x])
{
mp[x]=++cnt;
}
++a[mp[x]];
}
sort(a+1,a+cnt+1);
int sum=0;
for(int j=1;j<=n;++j)
{
int m=0;
int l=1;
for (int k=j;k<=n;k*=2)
{
int p=lower_bound(a+l,a+cnt+1,k)-a;
if(p==cnt+1)
break;
m+=k;
l=p+1;
}
sum=max(sum,m);
}
printf ("%d\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: