源代码: #include<cstdio> #include<iostream> #define LL long long using namespace std; LL m,n,i[100001],f[100001]; //为什么数据类型都这么坑爹! bool Check(LL Mid) //模拟+贪心=Check(),后面的目标显然都已扫描过了。 { for (LL a=1,b=1;a<=n;a++) { if (i[a]-f[b]>Mid) //再往下肯定还超,因为递增,所以非法。 return false; LL End; //最终指针能够到达的点。 if (f[b]<i[a]) //目标在指针后面。 { LL T=Mid-(i[a]-f[b]); End=max(f[b]+T,i[a]+T/2); //先左再右与先右再左。 } else End=i[a]+Mid; //目标在指针前面,只能向前。 while (f[b]<=End&&b<=m) //更新目标。 b++; if (b>m) //目标都已处理完毕。 return true; } return false; //非True即False。 } int main() { cin>>n>>m; //Windows下用scanf()应用%I64d。 for (LL a=1;a<=n;a++) cin>>i[a]; //指针。 for (LL a=1;a<=m;a++) cin>>f[a]; //目标。 LL Left=0,Right=(LL)1e10,Ans=0; while (Left<=Right) //二分答案。 { LL Mid=(Left+Right)/2; if (Check(Mid)) { Ans=Mid; Right=Mid-1; } else Left=Mid+1; } cout<<Ans; return 0; }