题目链接 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]; ///p[i]表示a[]中小于等于i的数量 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; }