包裹快递
2024年12月25日大约 1 分钟
暴力枚举 60 分
#include <bits/stdc++.h>
using namespace std;
int n; // 包裹数
// 第 i 个包裹接收时间段,以及距离上一个站点的路程
int x[200000 + 5], y[200000 + 5], s[200000 + 5];
// 检查最大速度为 maxV 时能否送完
// 显然最优方案就是最大速度狂飙
bool check(double maxV)
{
double tim = 0; // 当前时间
for (int i = 1; i <= n; i++)
{
tim += s[i] / maxV; // 送达时间
if (tim < x[i])
tim = x[i];
if (tim > y[i])
return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i] >> y[i] >> s[i];
for (double maxV = 0.001;; maxV += 0.001)
{
if (check(maxV))
{
cout << fixed << setprecision(2) << maxV;
return 0;
}
}
return 0;
}
二分
#include <bits/stdc++.h>
using namespace std;
int n; // 包裹数
// 第 i 个包裹接收时间段,以及距离上一个站点的路程
int x[200000 + 5], y[200000 + 5], s[200000 + 5];
// 检查最大速度为 maxV 时能否送完
// 显然最优方案就是最大速度狂飙
bool check(long double maxV)
{
long double tim = 0; // 当前时间
for (int i = 1; i <= n; i++)
{
tim += s[i] / maxV; // 送达时间
if (tim < x[i])
tim = x[i];
if (tim > y[i])
return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i] >> y[i] >> s[i];
long double l = 0;
long double r = 1000000000;
while (r - l >= 0.0001)
{
long double mid = (l + r) / 2;
if (check(mid))
r = mid;
else
l = mid;
}
cout << fixed << setprecision(2) << l;
return 0;
}