Maximum Value(unique函数,lower_bound()函数,upper_bound()函数的使用)

Posted sykline

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maximum Value(unique函数,lower_bound()函数,upper_bound()函数的使用)相关的知识,希望对你有一定的参考价值。

传送门

在看大佬的代码时候遇到了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
",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
",ans);
39     return 0;
40 }
View Code

 

以上是关于Maximum Value(unique函数,lower_bound()函数,upper_bound()函数的使用)的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 1239. Maximum Length of a Concatenated String with Unique Characters

SQL Select where LINE = MAXIMUM Value per Primary Key Oracle SQL Developer

1695. Maximum Erasure Value (M)

1695. Maximum Erasure Value

Leetcode 1881. Maximum Value after Insertion

Codeforces C. Maximum Value(枚举二分)