greenmint

导航

新光一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 这样就能过了代码就不贴了 谢谢观看

posted on 2026-04-08 09:48  绿萝薄荷叶  阅读(2)  评论(0)    收藏  举报