題目鏈接
2017ICPCECIC北方邀請賽D題
代碼
#include <iostream>
#include <cstdio>
#include <cstring>
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
using namespace std;
int p[MAXN];
int main()
{
int n,k,i,mina,ans,low,high,cnt,l,r,t;
while (scanf("%d%d",&n,&k)!=EOF)
{
mina=INF;
low=INF;high=0;
memset(p,0,sizeof(p));
for (i=1;i<=n;i++)
{
scanf("%d",&t);
mina=min(mina,t);
low=min(low,t);
high=max(high,t);
p[t]++;
}
if (mina<=k+1)
{
printf("%d\n",mina);
continue;
}
else
{
for (i=1;i<=high;i++)
p[i]+=p[i-1];
for (ans=high;ans>k+1;ans--)
{
cnt=0;
for (i=0;i<=high;i+=ans)
{
l=i-1>=0?p[i-1]:0;
r=i+k<=high?p[i+k]:n;
cnt+=(r-l);
}
if (cnt==n) break;
}
printf("%d\n",ans);
}
}
return 0;
}