Maximum Value
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of ai divided by aj), where 1 ≤ i, j ≤ n and ai ≥ aj.
Input
The first line contains integer n — the length of the sequence (1 ≤ n ≤ 2·105).
The second line contains n space-separated integers ai (1 ≤ ai ≤ 106).
Output
Print the answer to the problem.
Sample test(s)
Input
3 3 4 5
Output
2
二分查找的问题
暴力显然超时,因为数据量很大。
规定了大数模小数,显然最大的模
出现在最靠近小数n倍的位置(2倍以上)
搜索这个值即可。
对输入数据应该进行去重处理。
//坑了半天!原来二分搜索!
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int M=200005;
int su[M];
int shu[M];
int uni(int n) //去掉重复元素
{
shu[0]=su[0];
int p=1;
for(int i=1;i<n;i++)
{
if(su[i]!=su[i-1])
{
shu[p]=su[i];
p++;
}
}
return p;
}
int bs(int lo,int hi,int k) //找出最接近k的数的位置
{
int mid,re=lo;
while(lo<=hi)
{
mid=(lo+hi)/2;
if(shu[mid]>=k)
hi=mid-1;
else
{
re=max(lo,mid);
lo=mid+1;
}
}
return re;
}
int find(int i,int n) //找出较小数为i时的最大模
{
int lo=0;
int re=0;
for(int j=shu[i]*2;lo<n-1;j+=shu[i])
{
lo=bs(lo,n-1,j);
re=max(re,shu[lo]%shu[i]);
}
return re;
}
int main()
{
int n;
int maxm;
while(scanf("%d",&n)!=EOF)
{
maxm=0;
for(int i=0;i<n;i++)
{
scanf("%d",&su[i]);
}
sort(su,su+n);
n=uni(n);
for(int i=0;i<n-1;i++)
{
maxm=max(maxm,find(i,n));
}
printf("%d\n",maxm);
}
return 0;
}