Description
小K成功地破解了密文。但是乘车到X国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去Orz教主……
一个快递公司要将n个包裹分别送到n个地方,并分配给邮递员小K一个事先设定好的路线,小K需要开车按照路线给的地点顺序相继送达,且不能遗漏一个地点。小K得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离。若到达某一个地方的时间早于可以签收的时间段,则必须在这个地方停留至可以签收,但不能晚于签收的时间段,可以认为签收的过程是瞬间完成的。
为了节省燃料,小K希望在全部送达的情况下,车的最大速度越小越好,就找到了你给他设计一种方案,并求出车的最大速度最小是多少。
Solution
最大值最小就要想到二分答案了
我们二分一个速度然后按照速度模拟一遍看看是否满足条件就可以了
关于精度问题,开long double能解决的就不深入纠结了
Code
#include <stdio.h>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define min(x, y) (x)<(y)?(x):(y)
#define max(x, y) (x)>(y)?(x):(y)
#define db long double
#define eps 0.0001
#define N 300001
int x[N], y[N], t[N];
inline int check(db p, int n){
db now = 0.0;
rep(i, 1, n){
now += t[i] / p;
if (now > y[i]){
return 0;
}else if (now < x[i]){
now = x[i];
}
}
return 1;
}
int main(void){
int n;
scanf("%d", &n);
db l = 0, r = 0.0;
rep(i, 1, n){
scanf("%d%d%d", &x[i], &y[i], &t[i]);
r += t[i];
}
db mid;
while (r - l >= eps){
mid = (l + r) / 2.0;
if (check(mid, n)){
r = mid;
}else{
l = mid;
}
}
printf("%.2f\n", mid);
return 0;
}