信息学奥赛一本通 1227:Ride to Office | OpenJudge NOI 4.6 2404:Ride to Office

【题目链接】

ybt 1227:Ride to Office
OpenJudge NOI 4.6 2404:Ride to Office
原题是英文题,虽说两题题意相同,但一本通网站没有对该问题进行直译,名字都不一样。而且描述不够完整。我在这里再翻译一下。

【题目翻译】

骑车上班

描述

许多员工住在一个叫做M小区的地方,距离他们的单位很远(4.5公里)。由于交通堵塞,许多员工选择骑车。
我们可以假设除了魏威以外所有员工都以恒定的速度从家骑到单位。魏威这个人有不同的骑车习惯——他总是试图跟着其他骑车的人而不是自己单独骑车。当魏威到达M小区的大门时,他会寻找其它正要出发去单位的人。如果他找到了,他会骑车跟着那个人,否则,他会等待可以跟随的人。在从家到单位的路上,任何时刻只要有一个骑得更快的人超过了魏威,那么他会离开他正在跟随的骑行者,并加速去追那个骑得更快的人。
我们假设魏威到达M小区大门的时间是0。给定其它人的出发时刻和速度,你的任务是给出魏威到达单位的时间。

输入

有多组测试样例。每个测试样例的第一行是 N ( 1 ≤ N ≤ 10000 ) N(1\le N \le 10000) N(1N10000),代表骑行者的数量(除了魏威)。
N = 0 N=0 N=0时结束输入。接下来的N行是N个不同骑行者的信息,形式如下:
Vi [TAB] Ti
Vi 是一个小于等于40的正整数,表示第i个骑行者的速度(kph,公里/小时)。Ti是第i个骑行者的触发时间,是一个整数,单位是秒。任何样例都可以保证总是有一个非负的Ti。

输出

对每个样例输出一行:魏威的到达时间。当遇到分数时,向上取整。

【题目考点】

1. 贪心

【解题思路】

t 0 t_0 t0为魏威的出发时间,他的出发时间为大于等于0的骑行者出发时间中的最小值。

  1. 出发时间 t x t_x tx早于魏威出发时间 t 0 t_0 t0的人 x x x(即 t x < t 0 t_x < t_0 tx<t0),一定不会被魏威跟随同时到达终点。
    有两种情况:
    (1)如果魏威的速度小于或等于 x x x的速度,那么魏威一定追不上 x x x,不会与他同时到达终点。
    (2)如果魏威的速度大于骑行者x的速度,他仍然可能追不上 x x x。如果在骑行过程中追上了 x x x,他就会超过 x x x。由于魏威只会跟随速度大于等于他的骑行者,所以他不会跟随 x x x

  2. 在出发时间等于或晚于魏威出发时间的骑行者中,只要有超过魏威的骑行者,魏威就会跟上那个人。如果把这个过程看做自行车比赛,魏威就会一直跟着比赛过程中排在第一名的骑行者,因而魏威也一定会跟着第一个冲到终点的骑行者。
    所以魏威从出发到到达单位的总时间,就是出发时间等于或晚于魏威出发时间( t x ≥ 0 t_x \ge0 tx0)的骑行者中,第一个到达终点4500m位置的骑行者的骑行时间。
    根据:速度*时间=路程,如果 v x v_x vx为某骑行者的速度, t x t_x tx为该骑行者的出发时刻, t a r r t_{arr} tarr为到达终点的时刻, s s s为路程,那么有
    s = v x ∗ ( t a r r − t x ) s = v_x*(t_{arr} - t_x) s=vx(tarrtx)
    t t t,有 t a r r = s + v x ∗ t x v x t_{arr} = \frac{s + v_x*t_x}{v_x} tarr=vxs+vxtx
    已知s为4500,求满足 t x ≥ 0 t_x\ge 0 tx0 x x x中,求出的 t a r r t_{arr} tarr的最小值。

【题解代码】

解法1:求满足 t x ≥ 0 t_x\ge 0 tx0 x x x中, s + v x ∗ t x v x \frac{s + v_x*t_x}{v_x} vxs+vxtx的最小值。
#include<bits/stdc++.h>
using namespace std;
#define N 10005
#define INF 1e9
int main()
{
    int n;
    double v[N], t[N];//v:速度,单位m/s 
    while(cin >> n && n != 0)
    { 
        double tmin = INF, time;
        for(int i = 1; i <= n; ++i)
        {
            cin >> v[i] >> t[i];
            v[i] *= 5.0/18;//单位从km/h变为m/s 
            if(t[i] >= 0)//找出发时间等于或晚于st_i的骑手中
                tmin = min(tmin, 4500/v[i]+t[i]);//求出i到达终点的时刻中的最小值 
        }
        cout << ceil(tmin) << endl;
    }
    return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值