#include <iostream>
#include <cstdio>
#define N 1000010
using namespace std;
int a[N/3];
int sum[N*2];
int n,k,m,ma,ans;
bool running(int Ans)
{
int limit=ma/Ans;
int ret=0;
for(int i=1;i<=limit;i++)
ret+=(sum[i*Ans+k]-sum[i*Ans-1]);
return ret==n;
}
int main()
{
scanf("%d%d",&n,&k);
m=11111111;
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
sum[a[i]]++;
m=min(m,a[i]);
ma=max(ma,a[i]);
}
for(int i=m;i<=ma+k;i++){
sum[i]+=sum[i-1];//求前缀和,判断某个区间内有多少个数
//cout<<i<<": "<<sum[i]<<endl;
}
if(m<=k+1) {cout<<m<<endl;return 0;}
for(ans=m;ans>=k+1;ans--)
{
if(running(ans))
{
cout<<ans<<endl;
return 0;
}
}
return 0;
}
Codeforces 354C. Vasya and Beautiful Arrays【DP,暴力】
原文:http://blog.csdn.net/u013912596/article/details/38823125