POJ 1922 Ride to School

题目描述:
    Charley想要从起点到达终点,路程是4.5km,这一过程必须和另外一个人同行,假设有n个人要走这段路程,他们分别在不同的时间出发,匀速行驶。在同行的过程中如果有人从旁边经过,Charley 就会跟速度较快的那个人同行,求到达终点所需的最短时间。
算法分析:
    以n个人中第一个出发的那个为原点,出发时间为0,其他人的出发时间都以第一个出发的人为参照物,由于是和第一个出发的人同时出发,如果后面的人在晚出发的情况下能追上前面的两个人,肯定这个人的速度更快,即选择与此人同行,因此在这n+1个人中,Charley总是离目的地最近的,根据出发时间和速度计算出最先到达的那个人的到达时间就是Charley到达终点的最短时间。

    题目中路程单位是km,速度单位是km/h,而给出的时间单位是s,要注意单位的转换。

Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
struct rider
{
    double v;
    double st;  //出发时间
    double et;  //到达时间
};
rider r[maxn];
int cmp( rider a, rider b )
{
    return a.et < b.et;
}
int main()
{
    int n;
    while( scanf( "%d", &n ), n )
    {
        for( int i = 0; i < n; i++ )
        {
            scanf( "%lf%lf", &r[i].v, &r[i].st );
            if( r[i].st < 0 )
                r[i].et = 99999999;
            else
                r[i].et = r[i].st + 4.5 * 3600 / r[i].v;
        }
        sort( r, r + n, cmp );
        int ans = r[0].et > (int) r[0].et ? (int) ( r[0].et + 1 ) : (int) r[0].et;
        printf( "%d\n", ans );
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值