在看大佬的代码时候遇到了unique函数以及二分查找的lower_bound和upper_bound函数,所以写这篇文章来记录以备复习。
unique函数
在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
STL中关于二分查找的函数有三个lower_bound 、upper_bound 。这两个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数。
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。
思路:枚举每个数的倍数,然后二分查找第一个小于该倍数的数字,维护一下最大的答案就可以了。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <set> 6 #define INF 0x3f3f3f3f3f 7 8 using namespace std; 9 typedef long long ll; 10 const int maxn = 2e5+5; 11 int buf[maxn]; 12 13 14 int main() 15 { 16 int n; 17 scanf("%d",&n); 18 memset(buf, -1, sizeof(buf)); 19 for(int i = 0; i < n; i++) 20 { 21 scanf("%d",&buf[i]); 22 } 23 sort(buf, buf + n); 24 n = unique(buf, buf + n) - buf;//去重 25 int ans = 0,t; 26 for(int i = 0; i < n; i++) 27 { 28 for(int j = buf[i]; j <= buf[n-1]; j += buf[i]) 29 { 30 int pos = lower_bound(buf+i, buf+n, buf[i]+j) - buf - 1;//是从buf[i]的2倍开始搜的 31 //printf("pos:%d\n",buf[pos]); 32 t = buf[pos] % buf[i]; 33 ans = max(ans, t); 34 if(t == buf[i] - 1) 35 break; 36 } 37 } 38 printf("%d\n",ans); 39 return 0; 40 }
原文地址:https://www.cnblogs.com/sykline/p/9737843.html
时间: 2024-10-12 04:45:33