首页 > 其他分享 >会议室预约系统优化(蓝桥杯)

会议室预约系统优化(蓝桥杯)

时间:2024-03-16 19:29:25浏览次数:23  
标签:系统优化 会议室 预约 蓝桥 BOOK 时间 操作 id

文章目录

会议室预约系统优化

问题描述

假设你是一家大型企业的 IT 工程师,企业内有

n 个会议室,每天都有多个部门预约会议室进行会议。你的任务是优化现有的会议室预约系统。

你需要设计一个程序来支持以下两种操作:

  1. 预约会议室: 给定一个时间范围 [start,end] 和一个会议室的 ID ,预约该会议室在这个时间范围内。
  2. 查询会议室状态: 给定一个时间点 t 和一个会议室的 ID,返回该会议室在时间点 t 的预约状态,即在这个时间点,该会议室正在被预约多少次。

输入格式
第一行包含一个整数 n,表示会议室的数量。

第二行包含一个整数 q,表示操作的数量。

接下来 q 行,每行描述一个操作。

如果是预约操作,则格式为:BOOK starttime endtime roomid。

如果是查询操作,则格式为:QUERY t roomid。

输出格式
对于每一个 QUERY 操作,输出一个整数,表示到时间点 t 为止,该会议室被预约了多少次。

样例输入

3
5
BOOK 10 20 0
BOOK 15 25 1
BOOK 20 30 0
QUERY 15 0
QUERY 25 1

样例输出

1
0

这里蓝桥官方给的样例好像是错的,应该为:

1
1

评测数据范围
1≤n≤105,1≤q≤105 ,0≤starttime<endtime≤109 , 0≤t≤109

差分

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,q; // n是会议室的数量,q是操作的数量。
    scanf("%d %d",&n,&q); // 读取n和q的值。
    vector<map<int,int>> a(n); // 创建一个向量a,包含n个map,每个map用于存储每个会议室的预约开始时间和结束时间的差分。

    while(q--) // 遍历q次操作。
    {
        string s;
        cin>>s; // 读取操作的类型,BOOK或QUERY。
        if(s=="BOOK")
        {
            int l,r,id; // l为预约开始时间,r为预约结束时间,id为会议室的ID。
            scanf("%d %d %d",&l,&r,&id); // 读取这三个值。
            a[id][l]+=1; // 在预约开始时间,增加一个预约。
            a[id][r+1]-=1; // 在预约结束时间的下一时刻,减少一个预约。
        }
        else
        {
            int t,id; // t是查询的时间点,id是会议室的ID。
            scanf("%d %d",&t,&id); // 读取这两个值。
            int cnt=0; // cnt用于统计到时间点t,该会议室的预约总次数。
            for(auto i : a[id]) // 遍历id会议室的所有预约记录。
            {
                if(i.first > t) break; // 如果记录的时间点大于查询时间点t,则结束循环。
                cnt += i.second; // 累加每个有效时间点的预约差分值。
            }
            printf("%d\n",cnt); // 输出到时间点t,会议室id的预约总次数。
        }
    }
    return 0;
}

这个代码使用了一种称作"差分数组"的技术来高效管理会议室预约的增加和减少。通过在预约开始时增加计数,在预约结束后的下一时刻减少计数,这样就可以通过累加到任何给定时间点的差分值来计算该时间点的总预约次数。这种方法的优点是更新预约状态的操作时间复杂度为O(1),查询操作的时间复杂度为O(m),其中m是对应会议室的预约记录条数,这在大多数情况下要优于直接遍历每个预约记录来计算总预约次数。

标签:系统优化,会议室,预约,蓝桥,BOOK,时间,操作,id
From: https://blog.csdn.net/m0_73841621/article/details/136750800

相关文章

  • 蓝桥杯 递增三元组
    Problem:蓝桥杯递增三元组文章目录思路解题方法复杂度前缀和Code二分Code双指针Code思路这是一个关于数组的问题,我们需要找到一个递增的三元组。这个三元组由三个数组中的元素组成,每个数组提供一个元素,并且这三个元素满足递增的关系。解题方法我们可以使用......
  • [蓝桥杯 2017 国 C] 合根植物(P8654)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();intn,m;map<int,int>fa;intfindB(intx){if(fa[x]==x)returnx;returnfa[x]=findB(......
  • java毕业设计-基于springboot开发的会员制医疗预约服务管理信息系统-毕业论文+答辩PPT
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构三、系统实现展示1、系统功能模块2、管理员功能模块3、医生功能模块3、会员功能模块四、毕设内容和源代码获取总结java毕业设计-基于springboot开发的会员制医疗预......
  • 贪心算法(算法竞赛、蓝桥杯)--均分纸牌
    1、B站视频链接:A30贪心算法P1031[NOIP2002提高组]均分纸牌_哔哩哔哩_bilibili题目链接:[NOIP2002提高组]均分纸牌-洛谷#include<bits/stdc++.h>usingnamespacestd;intn,a[101],av,cnt;intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%d&quo......
  • 贪心算法(算法竞赛、蓝桥杯)--奶牛晒衣服
    1、B站视频链接:A28贪心算法P1843奶牛晒衣服_哔哩哔哩_bilibili题目链接:奶牛晒衣服-洛谷#include<bits/stdc++.h>usingnamespacestd;priority_queue<int>q;//用大根堆维护湿度的最大值intn,a,b;inttim,maxn;intmain(){ scanf("%d%d%d",&n,&a,&b); for......
  • 微信小程序 代驾预约评价系统 uniapp毕业设计源码lw
    代驾系统的系统项目的概述设计分析,主要内容有平台的具体分析,进行数据库的是设计,数据采用mysql数据库,并且对于系统的设计采用比较人性化的操作设计,对于系统出现的错误信息可以及时做出处理及反馈。本代驾服务系统主要包括系统用户管理模块、代驾线路信息管理、车辆信息管理、代......
  • 蓝桥杯刷题(七)
    [蓝桥杯2023省A]平方差题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示【样例说明】【评测用例规模与约定】代码题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示代码题目描述输入格式输出格式样例#1样......
  • 基于SSM的网上医院预约挂号系统的设计与实现(论文+源码)_kaic
    摘 要如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让医院预约挂号信息的管理模式进行升级,也为了更好的维护医院预约挂号信息,网上医院预约挂号系统的开发运用就显得很有必要。并且通过开发网上医院预约挂号系统,不仅可以让所学的SSM......
  • 第八届蓝桥杯省赛 分巧克力(二分)
    题目描述:  思路:给出N个长方形的长和宽,可以分别看长能被分成多少块,宽能被分为多少块,也就是(h/mid)*(w/mid),使其大于等于K所以我们可以通过二分去找,最大的边长是多少AC代码: #include<iostream>usingnamespacestd;typedeflonglongLL;constintN=1......
  • 蓝桥杯 3.14 三国问题
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+100;inta1[N],b1[N],c1[N],w[N];longlongn,m;longlongs;intsheng(inta[],intb[],intc[]){memset(w,0,sizeof(w));//数组初始化为0,只有在定义时才可以用{0}//cout<<'$';for(int......