题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,并且ai≥a j
CODE
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
int _hash[2100000], dp[2100000], a[2100000];
int main()
{
int n, i, j, x, min1, ans, max1;
while(scanf("%d",&n)!=EOF)
{
memset(_hash,0,sizeof(_hash));
min1=INF;
max1=-1;
for(i=0; i<n; i++)
{
scanf("%d",&x);
_hash[x]=1;
min1=min(min1,x);
max1=max(max1,x);
}
for(i=min1; i<=2000000; i++)///预处理
{
if(_hash[i-1]) dp[i]=i-1;
else dp[i]=dp[i-1];
}
ans=0;
for(i=1; i<=1000000; i++)
{
if(_hash[i])
{
for(j=2*i; ; j+=i)///****
{
if(dp[j]<i) continue ;
ans=max(ans,dp[j]%i);
if(dp[j]==max1) break;
}
}
}
printf("%d\n",ans);
}
return 0;
}