1 条题解

  • 0
    @ 2025-5-5 14:11:57

    题解

    问题分析:这是一个关于模拟查理(Charley)跟随其他骑手从万柳校区到燕园的问题。查理的骑行策略是优先跟随速度快的骑手,若当前跟随的骑手被更快的骑手超过,查理就转而跟随更快的骑手。需要根据其他骑手的出发时间和速度,计算出查理到达燕园的时间。

    关键思路:

    读取每个骑手的速度和出发时间,将其存储在合适的数据结构中。 首先检查是否有骑手在查理到达(时间为 0)时已经出发或即将出发(出发时间小于等于 0)。如果有,查理可以立即跟随其中速度最快的骑手;如果没有,查理需要等待到第一个骑手出发。 从查理出发开始,模拟他的骑行过程。对于每个骑手,检查在查理骑行过程中该骑手是否会超过查理(即该骑手的速度大于查理当前跟随的骑手速度,并且该骑手的出发时间加上骑行到超过查理位置所需的时间小于查理到达终点的时间)。如果会超过,更新查理跟随的骑手为该骑手,并计算新的到达时间。 不断重复上述过程,直到查理到达燕园,最终得到查理的到达时间并向上取整输出。 #cpp #include #include #include #include using namespace std;

    // 定义骑手结构体,包含速度和出发时间 struct Rider { int speed; int start_time; };

    // 比较函数,用于按速度从大到小排序骑手 bool compare(const Rider& a, const Rider& b) { return a.speed > b.speed; }

    int main() { int n; while (true) { cin >> n; if (n == 0) break; vector riders(n); for (int i = 0; i < n; ++i) { cin >> riders[i].speed >> riders[i].start_time; }

    int charley_start_time = 0; int max_speed = 0; // 检查是否有骑手在时间0或之前出发 for (const auto& rider : riders) { if (rider.start_time <= 0 && rider.speed > max_speed) { max_speed = rider.speed; } } if (max_speed == 0) { // 没有在时间0或之前出发的骑手,找到最早出发的骑手的时间 charley_start_time = riders[0].start_time; for (const auto& rider : riders) { if (rider.start_time < charley_start_time) { charley_start_time = rider.start_time; } } }

    double charley_arrival_time = 4.5 / max_speed * 3600; // 初始到达时间,单位为秒 for (const auto& rider : riders) { if (rider.speed > max_speed) { // 计算该骑手超过查理所需的时间 double time_to_overtake = (rider.start_time * 1.0 * rider.speed + charley_arrival_time * max_speed) / (rider.speed - max_speed); if (time_to_overtake < charley_arrival_time && time_to_overtake >= rider.start_time) { // 该骑手会在查理到达前超过他 charley_arrival_time = time_to_overtake + 4.5 / rider.speed * 3600; max_speed = rider.speed; } } }

    // 向上取整 int result = ceil(charley_arrival_time); cout << result << endl; }

    return 0; }

    • 1

    信息

    ID
    923
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    7
    已通过
    1
    上传者