一个很水的二分,但因精度问题T3也很气。。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-8
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
int x[60050],v[60050];
int n;
int check(double &t)
{
int i;
double le,ri;
le=x[0]-v[0]*t;
ri=x[0]+v[0]*t;
for(i=1;i<n;i++)
{
le=max(le,x[i]-v[i]*t);
ri=min(ri,x[i]+v[i]*t);
if(ri<le)
return 0;
}
return 1;
}
int main()
{
double l,r,mid,ans;
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=0;i<n;i++)
scanf("%d",&v[i]);
l=0,r=1e9;
while(r-l>1e-7)
{
mid=(l+r)/2;
if(check(mid))
{
r=mid;
ans=mid;
}
else
{
l=mid;
}
}
printf("%.10lf\n",ans);
return 0;
}
精度1e-8时,上面的代码会t,但下面这个基本一样的代码,区别就是把check放到主函数里,这个就可以过,在编译器运行test3都是无限循环(试了codeblocks和dev),可是交了就能过,很迷。。。。。。
3 1 1000000000 2 1 2 1000000000
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-8
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
int x[60050],v[60050];
int n;
int main()
{
double l,r,mid,ans,m,le,ri;
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=0;i<n;i++)
scanf("%d",&v[i]);
l=0,r=1e9;
while(r-l>1e-8)
{
mid=(l+r)/2;
int flog=1;
le=x[0]-v[0]*mid;
ri=x[0]+v[0]*mid;
for(i=1;i<n;i++)
{
le=max(le,x[i]-mid*v[i]);
ri=min(ri,x[i]+mid*v[i]);
if(ri<le)
{
flog=0;
break;
}
}
if(flog)
{
r=mid;
ans=mid;
// printf("%.9lf %.9lf\n",r,l);
}
else
{
l=mid;
}
}
printf("%.10lf\n",ans);
return 0;
}