您的位置:首页 > 产品设计 > UI/UE

CF_484B_MaximumValue

2015-07-29 22:27 309 查看
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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: