文章

18

粉丝

183

获赞

57

访问

102.5k

头像
1881 结构体简单模拟 容易想太复杂
P1881 华东师范大学2020年机试
发布于2022年9月5日 11:16
阅读数 5.9k

思路

  • 最后一辆小车需要匀速走完全程,速度需要最快,则时间最短,即在终点与前一辆车相遇,则所求答案为d/t
  • t是前面所有车中最后一辆车到达终点的时间,怎么求呢?
    • 一看开始想到,前面的车碰到其他车时,会减速,所以我们要通过代码把前面所有车的运行状况模拟出来,包括匀速行驶、碰到车后减速行驶...但是路程计算非常复杂麻烦
    • 后来转念一想,无论车怎么相遇,总有一辆车是匀速到达终点的,例如
      • 车1遇车2,然后车1车2以相同速度到终点,车2全程匀速
      • 车1遇车2,以v2匀速,然后车1和车2一起遇车3,以v3一直到终点,车3全程匀速
      • 车1遇车2,车3先到终点,车1和车2仍然以v2匀速到终点...
    • 而一直匀速行车的这张车花费的时间,就是所有车(不包含最后一张)到达终点所花费的时间t,也就是最大时间
  • 所以,我们只需要算出所有车匀速行驶的时间t,找出其中的最大值t_max,然后用d/t_max就行了

 

想通了,代码就很简单了


代码如下

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int v;
    int k;
    int s;
    double t;
};

int d, n;

int main()
{
    while (cin >> d >> n)
    {
        node car[n];
        double max_t = 0;
        for (int i = 0; i < n; i++)
        {
            cin >> car[i].k >> car[i].v;
            car[i].s = d - car[i].k;
            car[i].t = car[i].s * 1.0 / car[i].v;

            max_t = max(max_t, car[i].t);
        }
       ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发