0
点赞
收藏
分享

微信扫一扫

c++宾馆房间(差分数组)

【题目描述】:
2180年奥运会竞技类分会场,将在XX市举行。会场自然是政府的事情,我们就别操心了。艾瑞克却被兴奋而苦恼的情绪折磨着,他的宾馆是XX市最好的宾馆,近期旅客投宿的订单m份接踵而至,时间从1~n天,这代表着大把大把的银子,可是他最多只能提供k间客房,更多的他只能提前去租附近的房子并赶紧装修一下,时间很紧啊。

艾瑞克找到了他最好的朋友你:“哪,这是所有的订单,你给我在1s内计算出最高峰时,超出多少间客房,这样我才能知道得去租多少房子啊。”

每张订单包含dj,sj,tj:表示从第sj日至第tj日,预定房间dj间。

住:为了简单起见,假设第一天之前宾馆所有的房间都是空的。

【输入描述】:
第一行包含两个正整数n,m,k,表示天数、订单的数量,和现有客房数。

接下来有m行,每行包含三个正整数dj,sj,tj,表示租借的数量,租借开始、结束分别在第几天。

每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。

【输出描述】:
只有一个整数,表示最高峰时还差多少客房,客房足够输出0(骗不到分)。

【样例输入】
4 3 6
2 1 3
3 2 4
4 2 4

【样例输出】
3

【数据范围及描述】:
时间:1s 空间:512M

1<=n,m<=1000,000;1<=sj<=tj<=n;1<=k,dj<=1000;

输入数据较大,最好加wg


以下是使用C++语言实现宾馆房间差分数组的示例代码:


#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;

    vector<int> rooms(n + 1, 0); // 初始化房间数组,下标从1开始

    for (int i = 0; i < m; i++) {
        int d, s, t;
        cin >> d >> s >> t;

        rooms[s] += d; // 在开始日期增加预定房间数
        if (t + 1 <= n) {
            rooms[t + 1] -= d; // 在结束日期的下一天减去预定房间数
        }
    }

    int maxRooms = k; // 最多可提供的客房数
    int extraRooms = 0; // 超出客房数

    for (int i = 1; i <= n; i++) {
        rooms[i] += rooms[i - 1]; // 计算差分数组

        if (rooms[i] > maxRooms) {
            extraRooms += rooms[i] - maxRooms; // 统计超出的客房数
        }
    }

    cout << extraRooms << endl;

    return 0;
}

在上述代码中,我们使用了一个大小为n+1的差分数组rooms来表示每一天的客房变动情况。首先将房间数组初始化为0,然后根据订单信息更新差分数组。在开始日期增加预定房间数,而在结束日期的下一天减去预定房间数,这样就构建了差分数组。

接下来,我们遍历差分数组,并累计超出最大客房数的房间数量,即超出部分的客房数。最终输出超出的客房数即可。

由于输入数据较大,可能需要使用wg工具(如O2优化)来加快代码执行速度。

举报

相关推荐

0 条评论