代码如下,已AC
#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
int n,p[60001],v[60001];
double le[60001],re[60001];
void read(){
scanf("%d",&n);
_for(i,1,n) scanf("%d",&p[i]);
_for(i,1,n) scanf("%d",&v[i]);
}
void init(){
memset(le,0xff,sizeof(le));
memset(re,-0xff,sizeof(re));
//使各区间永远没有交集
return;
}
void clac(double t){
_for(i,1,n) le[i]=p[i]-t*v[i],re[i]=p[i]+t*v[i];//计算出区间下标与上标
}
double bsearch(double l,double r){
double mid=(l+r)/2;
if(l+0.000000000001>r){
/*_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);*/
return mid;//精度达到最高
}
clac(mid);
double maxl=DBL_MIN,minr=DBL_MAX;
_for(i,1,n) maxl=max(maxl,le[i]),minr=min(minr,re[i]);
if(maxl==minr){
/*_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);*/
return mid;
}
else{
/*printf("\n%5.1f\n",mid);
_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);
printf("\n");*/
if(maxl>minr) return bsearch(mid+0.000000000001,r);
if(maxl<minr) return bsearch(l,mid-0.000000000001);
}
}
---------------No Copying--------------
int main(int argc,char *argv[]){
read();
init();
int minv=INT_MAX,maxp=INT_MIN;
_for(i,1,n) minv=min(minv,v[i]),maxp=max(maxp,p[i]);
double ans=bsearch(0, double(maxp)/double(minv));
printf("%.12lf",ans);
return 0;
}
然后这个代码放在样例2显然是不过的, 但是不知道什么原因就AC了