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的位置。

思路:枚举每个数的倍数,然后二分查找第一个小于该倍数的数字,维护一下最大的答案就可以了。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#define INF 0x3f3f3f3f3f

using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
int buf[maxn];


int main()
{
    int n;
    scanf("%d",&n);
    memset(buf, -1, sizeof(buf));
    for(int i = 0; i < n; i++)
    {
        scanf("%d",&buf[i]);
    }
    sort(buf, buf + n);
    n = unique(buf, buf + n) - buf;//去重
    int ans = 0,t;
    for(int i = 0; i < n; i++)
    {
        for(int j = buf[i]; j <= buf[n-1]; j += buf[i])
        {
            int pos = lower_bound(buf+i, buf+n, buf[i]+j) - buf - 1;//是从buf[i]的2倍开始搜的
            //printf("pos:%d\n",buf[pos]);
            t = buf[pos] % buf[i];
            ans = max(ans, t);
            if(t == buf[i] - 1)
                break;
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sykai1/article/details/81461637