1 条题解

  • 0
    @ 2025-10-20 10:55:40

    「PA 2020」Samochody dostawcze 题解

    算法思路

    本题使用哈希映射碰撞检测的简单方法来解决车辆调度问题。核心观察是两辆车相撞的数学条件可以通过简单的坐标变换来表示。

    关键观察

    1. 车辆运动模型

    • 类型1车辆:从 (wi,0)(w_i, 0) 向北行驶,在时刻 tt 的位置为 (wi,tti)(w_i, t - t_i)
    • 类型2车辆:从 (0,wi)(0, w_i) 向东行驶,在时刻 tt 的位置为 (tti,wi)(t - t_i, w_i)

    2. 碰撞条件

    两辆车在 (x,y)(x, y) 处相撞的条件是:

    • 类型1车辆:x=w1x = w_1y=tt1y = t - t_1
    • 类型2车辆:x=tt2x = t - t_2y=w2y = w_2

    联立得:w1=tt2w_1 = t - t_2w2=tt1w_2 = t - t_1

    消去 tt 得到:w1+t1=w2+t2w_1 + t_1 = w_2 + t_2

    代码解析

    数据存储

    map<int, int> mp[2];  // mp[0]存储类型1车辆,mp[1]存储类型2车辆
    
    while (n--) {
        int x, w, t;
        cin >> x >> w >> t;
        mp[x - 1][w - t]++;  // 关键:使用 w-t 作为键值
    }
    

    碰撞检测与计数

    // 确保所有可能的碰撞键值都存在
    for (auto [x, y] : mp[0])
        mp[1][x] += 0;
    
    int ans = 0;
    // 对于每个可能的碰撞位置,取两种类型车辆数量的最小值
    for (auto [x, y] : mp[1])
        ans += min(y, mp[0][x]);
    

    算法正确性

    碰撞条件推导

    对于类型1车辆 (w1,t1)(w_1, t_1) 和类型2车辆 (w2,t2)(w_2, t_2)

    • 它们在某个时刻 tt(w1,w2)(w_1, w_2) 相遇
    • 类型1车辆:w2=tt1w_2 = t - t_1t=w2+t1t = w_2 + t_1
    • 类型2车辆:w1=tt2w_1 = t - t_2t=w1+t2t = w_1 + t_2
    • 因此 w1+t2=w2+t1w_1 + t_2 = w_2 + t_1w1t1=w2t2w_1 - t_1 = w_2 - t_2

    最少取消数量

    对于每个碰撞键值 k=wtk = w - t

    • mp[0][k]mp[0][k] 辆类型1车辆和 mp[1][k]mp[1][k] 辆类型2车辆可能相撞
    • 最多只能保留 min(mp[0][k],mp[1][k])\min(mp[0][k], mp[1][k]) 对不相撞的车辆
    • 因此需要取消的数量是两者中较小的那个

    复杂度分析

    • 时间复杂度O(nlogn)O(n \log n)(map 操作)
    • 空间复杂度O(n)O(n)
    • 1

    信息

    ID
    3576
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者