题解:AtCoder AT_awc0004_d Parking Lot Assignment

【题目来源】

AtCoder:D - Parking Lot Assignment

【题目描述】

Takahashi is developing a parking lot management system for a shopping mall. The parking lot has \(N\) parking spaces arranged in a row, numbered Space \(1\), Space \(2\), ..., Space \(N\) from the entrance side.
高桥正在为一家购物中心开发停车场管理系统。停车场有 \(N\) 个停车位排成一行,从入口侧起依次编号为车位 \(1\)、车位 \(2\)、……、车位 \(N\)

Today, \(M\) cars are scheduled to visit, and all of these cars will use the parking lot during the same time period. The \(i\)-th car (\(1 \leq i \leq M\)) can park in any one of the consecutive parking spaces from Space \(L_i\) to Space \(R_i\).
今天有 \(M\) 辆车预约使用,且所有这些车将在同一时间段内使用停车场。第 \(i\) 辆车(\(1 \leq i \leq M\))可以停在从车位 \(L_i\) 到车位 \(R_i\) 的任意一个连续停车位中。

Each car must be assigned exactly one parking space, and no parking space can be assigned to two or more cars.
每辆车必须被分配恰好一个停车位,且任何一个停车位都不能被分配给两辆或更多车辆。

If it is possible to assign a parking space to every car, output Yes; otherwise, output No.
如果可能为每辆车分配一个停车位,则输出 Yes;否则,输出 No

【输入】

\(N\) \(M\)
\(L_1\) \(R_1\)
\(L_2\) \(R_2\)
\(\vdots\)
\(L_M\) \(R_M\)

  • The first line contains the number of parking spaces \(N\) and the number of arriving cars \(M\), separated by a space.
  • The \(i\)-th of the following \(M\) lines contains \(L_i\) and \(R_i\), representing the range of spaces where the \(i\)-th car can park, separated by a space.

【输出】

Print Yes on a single line if it is possible to assign a parking space to every car, or No if it is not possible.

【输入样例】

5 3
1 2
2 3
1 3

【输出样例】

Yes

【核心思想】

  1. 问题分析:给定 \(N\) 个停车位和 \(M\) 辆车,每辆车 \(i\) 可以停在区间 \([L_i, R_i]\) 内的任意一个停车位。需要判断是否能为每辆车分配一个唯一的停车位。这是一个贪心算法问题,关键在于如何确定车辆的分配顺序以最大化成功分配的可能性。

  2. 算法选择

    • 贪心策略(Greedy):每次优先处理选择范围最"紧迫"的车辆
    • 按右端点排序:将车辆按照 \(R_i\) 从小到大排序,\(R_i\) 相同时按 \(L_i\) 从小到大排序
    • 优先分配最左可用位置:对于每辆车,在其区间 \([L_i, R_i]\) 内选择第一个可用的停车位
  3. 关键步骤

    • 读取输入\(N\)(停车位数量)、\(M\)(车辆数量)、\(M\) 个区间 \([L_i, R_i]\)
    • 排序车辆:按照 \(R_i\) 升序排序,若 \(R_i\) 相同则按 \(L_i\) 升序排序
    • 贪心分配(遍历每辆车 \(i\)\(1\)\(M\)):
      • 在区间 \([L_i, R_i]\) 内从左到右扫描,寻找第一个未被使用的停车位 \(j\)
      • 若找到,标记 used[j] = true
      • 若未找到(即 \(j > R_i\)),输出 No 并结束
    • 输出结果:若所有车辆都成功分配,输出 Yes
  4. 时间/空间复杂度

    • 时间复杂度:\(O(M \log M + N \times M)\),排序 \(O(M \log M)\),最坏情况下每辆车扫描 \(O(N)\) 个位置
    • 空间复杂度:\(O(N + M)\)used[] 数组 \(O(N)\),存储车辆信息 \(O(M)\)
  5. 贪心算法的核心思想

    • 右端点优先策略:右端点 \(R_i\) 小的车辆选择余地更小,优先处理可以避免"占坑"导致后续车辆无法分配
    • 最左分配原则:在可用区间内选择最左边的位置,为后续车辆保留更多的右侧空间
    • 正确性证明思路:假设存在最优解,通过交换论证可以证明贪心策略不会比最优解差
    • 区间调度问题的经典应用:类似于活动选择问题,优先处理结束时间早的活动
    • 适用于资源分配、区间调度、任务安排等问题

【解题思路】

【算法标签】

贪心

【代码详解】

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;  // 定义最大数据范围
int n, m;              // n: 停车位数量, m: 车辆数量
struct Node            // 定义车辆数据结构
{
    int l, r;          // l: 可停最小位置, r: 可停最大位置
} a[N];
bool used[N];          // 标记停车位是否已被使用

// 比较函数,用于排序车辆
// 优先按右端点r从小到大排序,右端点相同时按左端点l从小到大排序
bool cmp(Node x, Node y)
{
    if (x.r != y.r)    // 如果右端点不同
        return x.r < y.r;  // 按右端点升序排序
    return x.l < y.l;  // 右端点相同时,按左端点升序排序
}

int main()
{
    // 读取输入数据
    cin >> n >> m;     // n: 停车位总数, m: 车辆总数

    // 读取每辆车的停车区间
    for (int i = 1; i <= m; i++)
        cin >> a[i].l >> a[i].r;  // 读取第i辆车的可停区间[l, r]

    // 对车辆按照排序规则进行排序
    // 排序后,右端点小的车辆优先处理,右端点相同时左端点小的优先
    sort(a + 1, a + m + 1, cmp);

    // 贪心算法分配停车位
    for (int i = 1; i <= m; i++)  // 遍历每一辆车
    {
        int j;  // 用于遍历可能的停车位置

        // 在当前车辆的可用区间[l, r]内寻找第一个空闲的停车位
        for (j = a[i].l; j <= a[i].r; j++)
        {
            if (!used[j])          // 如果位置j未被使用
            {
                used[j] = true;    // 标记位置j为已使用
                break;             // 找到位置,跳出循环
            }
        }

        // 检查是否找到了合适的停车位
        // 如果j > a[i].r,说明在区间内没有找到空闲位置
        if (j > a[i].r)
        {
            cout << "No" << endl;  // 无法为所有车辆分配停车位
            return 0;              // 程序结束
        }
    }

    // 如果所有车辆都成功分配到停车位
    cout << "Yes" << endl;         // 可以完成分配

    return 0;                       // 程序正常结束
}

【运行结果】

5 3
1 2
2 3
1 3
Yes
posted @ 2026-06-14 10:38  团爸讲算法  阅读(8)  评论(0)    收藏  举报