博客
关于我
noip借教室 题解
阅读量:805 次
发布时间:2023-02-16

本文共 1681 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要处理接下来的n天的借教室信息,其中每天可供租借的教室数量不同。我们需要处理m份订单,每份订单要求从某一天到另一天每天租借一定数量的教室。我们的任务是判断是否所有订单都能满足,如果不能,找出第一个无法满足的订单的申请人编号。

方法思路

我们采用二分答案的方法来快速确定是否存在一个订单无法满足条件。具体步骤如下:

  • 差分数组处理:我们使用差分数组来高效地处理每个订单对各天的影响。每个订单会在指定的天数范围内增加一定数量的教室需求。
  • 前缀和计算:通过前缀和计算每一天的总教室需求,并与每天可供租借的教室数量进行比较,判断是否满足条件。
  • 二分查找:使用二分查找来确定最大的可行订单数量k。如果k等于m,说明所有订单都满足条件;否则,说明第k+1个订单无法满足条件。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;int main() { int n, m; cin >> n >> m; vector
    r(n + 1); for (int i = 1; i <= n; ++i) { cin >> r[i]; } vector
    d(m + 1), s(m + 1), t(m + 1); for (int i = 1; i <= m; ++i) { int dj, sj, tj; cin >> dj >> sj >> tj; d[i] = dj; s[i] = sj; t[i] = tj; } vector
    diff(n + 2, 0); int left = 1; int right = m; int result = 0; while (left < right) { int mid = left + (right - left + 1) / 2; // 处理前mid个订单 for (int i = 1; i <= mid; ++i) { int s_i = s[i]; int t_i = t[i]; diff[s_i] += d[i]; if (t_i + 1 <= n) { diff[t_i + 1] -= d[i]; } } // 计算前缀和并检查 int current = 0; bool ok = true; for (int i = 1; i <= n; ++i) { current += diff[i]; if (current > r[i]) { ok = false; break; } } if (ok) { left = mid; } else { right = mid - 1; } } if (left == m) { cout << "0" << endl; } else { cout << "-1" << endl; cout << left + 1 << endl; }}

    代码解释

  • 读取输入:首先读取天数n和订单数量m,然后读取每天可供租借的教室数量,接着读取每份订单的详细信息。
  • 差分数组初始化:使用一个大小为n+2的差分数组来记录每个订单对各天的影响。
  • 二分查找:初始化left和right为1和m,使用二分法查找最大的可行订单数量k。
  • 处理订单:对于每个中间值mid,处理前mid个订单的差分数组,计算每一天的总教室需求,并检查是否满足条件。
  • 结果判断:如果找到最大的可行k等于m,输出0,否则输出-1和第一个无法满足条件的订单的编号。
  • 这种方法通过二分查找和差分数组高效地处理了大规模的数据,确保了算法的时间复杂度为O(n log m),在处理大数据时非常高效。

    转载地址:http://vojfk.baihongyu.com/

    你可能感兴趣的文章
    NSDateFormatter的替代方法
    查看>>
    NSOperation基本操作
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    nullnullHuge Pages
    查看>>
    numpy 用法
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>