1227:Ride to Office(贪心)

【题目描述】
起点与终点相隔4500米。现Charley需要从起点骑车到终点。但是,他有个习惯,沿途需要有人陪伴,即以相同的速度,与另外一个人一起骑。而当他遇到以更快的速度骑车的人时,他会以相应的速度跟上这个更快的人。先给定所有与Charley同路的人各自的速度与出发时间,问Charley以这种方式跟人,骑完4500米需要多少时间。得出的结果若是小数,则向上取整。

【输入】
输入若干组数据,每组数据第一行n(1≤n≤10000),n为0,表示输入结束,接着输入n行数据,每行2个数据,表示速度v和出发时间t,如果t<0,表示陪伴人提早出发了。

【输出】
输出对应若干行数据,每行输出1个数,表示最快到达的时间。

【输入样例】
4
20 0
25 -155
27 190
30 240
2
21 0
22 34
0
【输出样例】
780
771
题目分析:
拿到这个题一开始肯定是想的这是一个追记相遇问题,慢慢模拟,但想到最后想的脑子疼,所以就不想了,用投机取巧的方法去做,我对与贪心的理解就是把一个问题按最有利于自己思考的方向去转换,而不是一点点的模拟。所以这个问题就可以这么理解,这个人一旦遇到速度快的人就跟着速度快的跑了,所以他最后一定是跟着最先到达终点的到的。所以我们就可以找这几个人中最快到达终点的,输出他到达时的时刻,这个题就结束了。
而对于那些先走的,动动脑子想想都知道,如果追的上他,速度肯定比他快,怎么也不可能跟他走,所以先走的人和这个题一点关系都没有。
这个题应该是要给出速度时间单位的,但是他没给,这就会造成很多不必要的误解,就比如题中的速度单位是千米/小时。而时间单位是秒。所以我们要把速度换成米/秒。最后实际上是v/3.6所以就可以把3.6写道分式上面,写成4500*3.6.
代码:

#include<iostream>
#include<cmath>
using namespace std;
int a[10001][10001],t[10001];
int main()
{
    int n;
    while(cin>>n&&n!=0)
    {
        int mint=9999999;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i][0]>>a[i][1];
            if(a[i][1]>=0)//先走的人不管
                {
                    t[i]=ceil(4500*3.6/a[i][0]+a[i][1]);
                    if(mint>t[i]) mint=t[i];
                }
        }
        cout<<mint<<endl;
    }
    return 0;
}
发布了42 篇原创文章 · 获赞 42 · 访问量 9329

猜你喜欢

转载自blog.csdn.net/amazingee/article/details/104138040