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; }
相关文章推荐
- 二分查找及其举一反三的使用。
- SGISTL源码探究-stl_alog.h中的二分查找算法
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- 二分查找的实现和使用标准库函数实现二分查找
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- 编程珠玑中关于二分查找的使用
- stl 中list 或者vector正确使用find查找类对象
- 二分查找的学习与使用
- java使用递归和非递归实现二分查找
- 【转载】使用二分查找时,mid应该如何写?
- ACM 贪心 STL multiset 二分查找 hdu4268
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- Python中的递归函数及二分查找算法如何使用?
- STL之二分查找 (Binary search in STL)
- STL之二分查找 (Binary search in STL)
- collection类的工具类,collections,二分查找,折半查找,collections的常用方法,MAP的使用,
- pearl(二分查找,stl)
- STL中二分查找函数
- 二分查找及STL
- STL之二分查找 (Binary search in STL)