【华为OD机试 】 最少面试官数(C++ Java JavaScript Python)

597 阅读1分钟

题目描述

某公司组织一场公开招聘活动,假设由于人数和场地的限制,每人每次面试的时长不等,并已经安排给定,用(S1,E1)、 (S2,E2)、 (Sj,Ej)…(Si < Ei,均为非负整数)表示每场面试的开始和结束时间。

面试采用一对一的方式,即一名面试官同时只能面试一名应试者,一名面试官完成一次面试后可以立即进行下一场面试,且每个面试官的面试人次不超过 m。

为了支撑招聘活动高效顺利进行,请你计算至少需要多少名面试官。

输入描述

输入的第一行为面试官的最多面试人次 m,第二行为当天总的面试场次 n,

接下来的 n 行为每场面试的起始时间和结束时间,起始时间和结束时间用空格分隔。

其中, 1 <= n, m <= 500

输出描述

输出一个整数,表示至少需要的面试官数量。

用例

输入2
5
1 2
2 3
3 4
4 5
5 6
输出3
说明总共有 5 场面试,且面试时间都不重叠,但每个面试官最多只能面试 2 人次,所以需要 3 名面试官。

参考

华为OD机试备考攻略 以及题库目录分值说明 考点说明

C++


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int max_count; // 每个面试官最多面试的次数
    int n; // 面试场次
    cin >> max_count >> n;

    vector<vector<int>> ranges(n, vector<int>(2));
    for (int i = 0; i < n; i++) {
        cin >> ranges[i][0] >> ranges[i][1];
    }

    // 按照右边界升序排序,方便求解最大不相交区间
    sort(ranges.begin(), ranges.end(), [](const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1];
    });

    vector<vector<int>> buckets(n);
    for (int i = 0; i < n; i++) {
        buckets[i].reserve(max_count); // 每个桶最多存放max_count个时间点
    }

    for (const auto& range : ranges) {
        int start_time = range[0];
        int end_time = range[1];

        for (auto& bucket : buckets) {
            // 每个面试官最多面试max_count次,且时间不冲突
            if (bucket.size() < max_count && (bucket.empty() || bucket.back() < start_time)) {
                bucket.push_back(end_time);
                break;
            }
        }
    }

    cout <<  count_if(buckets.begin(), buckets.end(), [](const vector<int>& bucket) {
        return !bucket.empty();
    }) << endl;

    return 0;
}