新光一2026-04-04 T1 P1542
新光一周赛题解
T1 包裹快递
题目描述
小 K 成功地破解了密文。但是乘车到 X 国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去 Orz 教主……
一个快递公司要将 \(n\) 个包裹分别送到 \(n\) 个地方,并分配给邮递员小 K 一个事先设定好的路线,小 K 需要开车按照路线给的地点顺序相继送达,且不能遗漏一个地点。小 K 得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离。若到达某一个地方的时间早于可以签收的时间段,则必须在这个地方停留至可以签收,但不能晚于签收的时间段,可以认为签收的过程是瞬间完成的。
为了节省燃料,小 K 希望在全部送达的情况下,车的最大速度越小越好,就找到了你给他设计一种方案,并求出车的最大速度最小是多少。
输入格式
第 1 行为一个正整数 \(n\),表示需要运送包裹的地点数。
下面 \(n\) 行,第 \(i+1\) 行有 3 个正整数 \(x _ i, y _ i, s _ i\),表示按路线顺序给出第 \(i\) 个地点签收包裹的时间段为 \([x _ i, y _ i]\),即最早为距出发时刻 \(x _ i\),最晚为距出发时刻 \(y _ i\),从前一个地点到达第 \(i\) 个地点距离为 \(s _ i\),且保证路线中 \(x _ i\) 递增。
可以认为 \(s _ 1\) 为出发的地方到第 \(1\) 个地点的距离,且出发时刻为 \(0\)。
输出格式
仅包括一个正数,为车的最大速度最小值,结果保留两位小数。
输入输出样例 #1
输入 #1
3
1 2 2
6 6 2
7 8 4
输出 #1
2.00
说明/提示
数据范围
- 对于 \(20\%\) 的数据,\(0 < n \le 10\)。
- 对于 \(30\%\) 的数据,\(0<x_i,y_i,s_i \le 1000\)。
- 对于 \(50\%\) 的数据,\(0<n \le 1000\)。
- 对于 \(100\%\) 的数据,\(0<n \le 2\times10^5\),\(x_i \le y_i \le 10^8\),\(s_i \le10^7\)。
样例解释
第一段用 \(1\) 的速度在时间 \(2\) 到达第 \(1\) 个地点,第二段用 \(0.5\) 的速度在时间 \(6\) 到达第 \(2\) 个地点,第三段用 \(2\) 的速度在时间 \(8\) 到达第 \(3\) 个地点。
思路
题目中要求输出车的最大速度最小是多少 很显然是二分答案 直接正常写一个二分
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const int MAXN=200005;
int x[MAXN],y[MAXN],s[MAXN];
int n;
bool check(double v){
double t=0.0;
for(int i=0;i<n;++i)
{
t+=s[i]/v;
if(t>y[i]) return false;
if(t<x[i]) t=x[i];
}
return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;++i) cin>>x[i]>>y[i]>>s[i];
double l=0.0,r=1e8;
for(int i=0;i<60;++i)
{
double mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid;
}
cout<<fixed<<setprecision(2)<<r<<endl;
return 0;
}
但是这样写总有一个测试点会WA 这是为什么呢?
因为二分精度会有所丢失 所以我们要把二分中的t改为long double 这样就能过了代码就不贴了 谢谢观看
浙公网安备 33010602011771号