蒟蒻武天骏…… 2023-08-30 13:14 采纳率: 0%
浏览 10

宾馆房间(差分数组)

宾馆房间

【题目描述】:

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;

输入数据较大,最好加外挂

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-30 16:10
    关注

    【以下回答由 GPT 生成】

    这个问题可以通过使用差分数组来解决。差分数组可以用来记录相邻元素之间的差值,这样可以在O(1)的时间内更新某一范围内的元素。我们可以使用差分数组来记录每一天需要的客房数量,然后累积这些差分值,得到每一天预订的客房数量。

    以下是解决该问题的具体步骤:

    1. 读取输入数据,包括天数n,订单数量m,和现有客房数量k。
    2. 创建一个差分数组diff,大小为n+1,初始值都为0。
    3. 读取m个订单,每个订单包括房间数量dj,起始日期sj,和截止日期tj。
    4. 对于每个订单,将起始日期的差分数组中的值加上dj,将截止日期+1的差分数组中的值减去dj。这样差分数组中的累积和就表示每一天所需的客房数量。
    5. 对差分数组进行累积求和,得到每一天预订的客房数量,并用maxRooms变量记录最大值。
    6. 计算最高峰时宾馆缺少的客房数量,即maxRooms与现有客房数量k的差。
    7. 输出最高峰时宾馆缺少的客房数量。

    下面是使用Python实现该解决方案的代码:

    n, m, k = map(int, input().split())
    
    diff = [0] * (n + 1)
    
    for _ in range(m):
        dj, sj, tj = map(int, input().split())
        diff[sj] += dj
        diff[tj + 1] -= dj
    
    maxRooms = 0
    rooms = k
    for i in range(1, n + 1):
        rooms += diff[i]
        maxRooms = max(maxRooms, rooms)
    
    shortage = maxRooms - k
    
    print(shortage)
    

    该算法的时间复杂度为O(m+n),适用于输入规模较大的情况。



    【相关推荐】


    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7619927
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月30日

悬赏问题

  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 关于#c++#的问题:(2)运算二叉树·表达式一般由一个运算符和两个操作数组成:(相关搜索:二叉树遍历)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)