题目链接:https://vjudge.net/problem/CodeForces-485D
这道题。。。比赛的时候我是真的不会,一道有思维含量的lower_bound的贪心题,是一道很好的开拓思维的题。
首先利用贪心的思想,怎样才能是他的mod值最大,当Ai是Aj的倍数-1时,此时获得的值是最大的,所以我们就按照这个规则进行搜素,为了方便,我们使用lower——bound函数进行,Aj的整数倍的搜索,不断进行枚举,而后将搜索到的坐标-1,所得的结果就是最接近他的倍数的那个值,此外此题还有一个省时间复杂度的小技巧,那就是,使用了unique函数作为去重函数,unique函数的解释
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const int INF=0x3f3f3f3f;
int a[maxn];
int main()
{
int n; scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
n=unique(a,a+n)-a;//减少时间复杂度,去重
int cnt=-1;
for(int i=0;i<n;i++)
{
for(int sum=a[i]*2;sum<=a[n-1]+a[i];sum+=a[i])
{
int t=lower_bound(a,a+n,sum)-a;
cnt=max(cnt,a[t-1]%a[i]);
}
}
printf("%d\n",cnt);
return 0;
}