Cj集训day8

OM 和 IO 竞赛退役的⼩ U 开启了他的学农之旅。当⼩ U 的同学们正在地⾥挖红薯时,教官突然
喊了⼀句“集合了!”。
此时,还有很多同学仍然在挖红薯。把铲⼦还掉,把红薯放进袋⼦⾥,是⼀件繁重、费⼒、又费时
间的⼯作。为了不让教官⽣⽓,⼩ U 班级的 n 个⼈想要在尽量短的时间内完成⾃⼰挖红薯的任务,并
回到⼀个指定的地点。
如果我们把学农的场地看成⼀个⽆限⼤的⼆维平⾯的话,那么第 i 个同学所在位置是 (x i ,y i ),且他
完成挖红薯任务的时间为 t i 个单位。所有同学会同时开始挖红薯。
班长可以决定⼩ U 班级的 n 个⼈的集合位置 (X,Y ),他需要让完成挖红薯任务并且回到指定位置
(X,Y ) 的时间最晚的⼈回到指定位置时的时间距离开始挖红薯的时间最短(X,Y 可以不为整数)。
值得注意的是,由于农⽥是⽅⽅正正的,所以同学们很难沿着不平⾏于坐标轴的⽅向⾏⾛。因此,
第 i 个⼈从完成任务到⾛到指定集合位置的时间为 |x i − X| + |y i − Y |。
当然,⼩ U 的班级都忙着挖红薯的任务,这样的问题就交给你了!
输入格式
第⼀⾏包含⼀个整数 n, 表⽰⼩ U 班级的⼈数。
接下来 n ⾏,每⾏有 3 个整数 x i ,y i ,t i ,表⽰第 i 个⼈所在的位置和他完成挖红薯任务所需要的时
间。
输出格式
输出⼀⾏⼀个⼩数,表⽰最后⼀个回到集合位置的⼈回到集合位置的时间距离开始挖红薯的时间的
最⼩值。如果你输出的答案和正确答案的差距不超过 10 −6 ,那么就认为你的答案正确。


本来是想着二分,结果发现可以O(N)做。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
#define db double
#define inf 1e9
using namespace std;
inline int read(){
    register char ch; bool sign=1; register int res=0;
    while(!isdigit(ch=getchar()))if(ch=='-')sign=0;
    while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
    if(sign)return res; return -res;
}
const int N=1e6+10;
signed main(){
    int n=read();
    db ru=-inf,lu=-inf,rd=inf,ld=inf,x,y,t;
    while(n--){
        x=read();y=read();t=read();
        ru=max(ru,x+y+t);
        lu=max(lu,y-x+t);
        rd=min(rd,y-x-t);
        ld=min(ld,x+y-t);
    }
    printf("%.8lf\n",max(ru-ld,lu-rd)/2.0);
}

猜你喜欢

转载自www.cnblogs.com/naruto-mzx/p/11793156.html