CodeForce B. The Meeting Place Cannot Be Changed

[训练赛] CodeForce B. The Meeting Place Cannot Be Changed

题目分析

题意:一个数轴上有不同的人,每个人都有固定的速度,让你找一个点,使得所有人都到达这个点所花费的时间最小

这是一个二分答案的题。显然要二分答案,用check()判断当前的时间是不是可行时间,如果可行,那么说明答案小于等于可行时间,更新右边界。反之更新左边界。 所以问题就简化成了如何判断二分点是否可行,也就是check()的写法,由于每个人可以向左或向右走,所以每一个时间都对应一个该人的移动范围,只要这个范围有一个共同的交集,那么说明该时间是可行时间。 所以问题又简化成了如何确定每个人的移动范围是否存在交集。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
typedef pair<int, int> PII;
#define W(a) for(int i = 0; i < a; i++)
#define enl '
'
#define pb push_back
#define gcd(a, b) __gcd(a, b)
#define io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define iread(n) scanf("%d", &n)
#define llread(n) scanf("%lld", &n)
#define dread(n) scanf("%lf", &n)
const int N = 60010;
int n;
double ans;

struct st{
    ll x; ll v;
}node[N];
bool check(double mid){
    double l = node[0].x - node[0].v * mid, r = node[0].x +node[0].x + node[0].v * mid;
    for(int i = 0; i < n; i++){
        l = max(l, node[i].x - node[i].v * mid);
        r = min(r, node[i].x + node[i].v * mid);
        if(r < l) return 0;
    }
    
    return 1;
}
double mid;
int main(){
    // io;
    cin >> n;
    for(int i = 0; i < n; i++) llread(node[i].x);
    for(int i = 0; i < n; i++) llread(node[i].v);
    double minn = 0, maxn = 1e9 + 1000;
    while(maxn - minn >= 0.0000001){
        mid = (maxn + minn) / 2;
        if(check(mid)) maxn = mid;  
        else minn = mid;
    }
    
    printf("%.12lf
", mid);
    return 0;
}
原文地址:https://www.cnblogs.com/FrankOu/p/14279579.html