您的位置:首页 > 其它

Codeforces 782B The Meeting Place Cannot Be Changed 二分(精度)

2017-03-06 09:11 417 查看
点击打开链接

题意:给出n个人的在x轴的位置和最大速度,求n个人相遇的最短时间(相遇位置不一定为整数点) n<=6e4

每个的速度为0~vi 如果在t秒能相遇 在ti<t也可能相遇,二分最小时间,O(n)判断每个人的移动范围是否有交集即可

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
struct node{
double x,v;
}p
;
int n;
bool check(double t)
{
double a,b;//移动范围
for(int i=0;i<n;i++)
{
double x=p[i].x-p[i].v*t;
double y=p[i].x+p[i].v*t;
if(i==0)
{
a=x;
b=y;
}
else
{
//移动范围无交集
if(a>y||b<x)
return false;

if(a<=x)
a=x;
if(b>=y)
b=y;
}
}
return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
scanf("%lf",&p[i].x);
for(int i=0;i<n;i++)
scanf("%lf",&p[i].v);
double l=0,r=1e9,ans=0;
//精度
while(r-l>1e-7)
{
double mid=(l+r)/2.0;
if(check(mid))
{
ans=mid;
r=mid;//注意:r不能赋为mid-1
}
else
l=mid;
}
printf("%.7lf\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: