POJ 1922 Ride to School(找规律题,数学)

题意:Charley骑车去上学,4500m的长度,从0时刻开始骑,一旦遇到速度比自己快的人,他就立刻跟着速度比自己快的人走,这段加速的时间视为0。问他到学校最短需要多长时间。

 

分析:1.对于开始的时间为负的人,没必要考虑,如果能追上,说明速度比他快;如果追不上,更不用考虑了。

      2.然后,这应该是一道贪心的题,总是跟着最快的人走,然后,想要最短的时间的话,只要跟着最早到校的那个人就OK了。

 

会用到一个函数:

                   函数名ceil

                  用 double ceil(double x);

                  功 返回大于或者等于指定表达式的最小整数

                  头文件:math.h

 

 

转自网上的神分析:
  注意以下几种情况:
  1.Charley出发后,一定是跟随着比较快的,但不一定是最快的。因为速度快,而且比Charley出发早,有可能Charley根本没有机会遇到他(如图中的a)。
  2.比Charley晚出发,但速度比较慢的。这种情况可以不用考虑。如图e,如果Charley可以追上的话,那么说明Charley当时的速度一定比e快,那么Charley就不会跟着e。
  3.当Charley出发一段时间后,有速度更快的人也出发,并且在某个时刻追上了Charley,那么Charley就会放弃速度慢的,而跟随速度快的。
综上所述,比Charley出发早的人,可以不用考虑。
  http://s4.sinaimg.cn/orignal/493bff036a54993039853
在图上可以看到,用彩色笔描出的折线段,就是Charley的行车线路。
花费的时间为 t0 + t1 + t2 = tb 
从图中可以知道,只要找到比Charley晚出发或同时出发的人当中最早到的同学的时间(出发时刻加上骑车时间)就是Charley所花的时间了。

 

贴一下代码:(240k,47ms)

 (代码中开始定义min_time只要为一个很大的值就可以了,目的就是控制循环,第一次赋值就给覆盖掉了)

C++语言:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    while( cin >>n &&n != 0)
    {
        double speed , time;
        double max_speed = 0 , min_time = 11111111111;
        while(n --)
        {
            cin >> speed >> time;
            if( time < 0) continue;
            time = 4.5 / speed * 3600 + time;
            if( time <= min_time)
            {
                min_time = time;
            }
        }
        min_time = ceil( min_time);
        cout << min_time << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值