dshkjf

news/2024/10/24 20:59:56

这道题目要求我们为罗宾的兄弟和母亲选择最佳的访问起始日期,以使兄弟的访问与最多的工作重叠,而母亲的访问与最少的工作重叠。下面是解题思路的详细讲解:

问题分析

  1. 输入参数

    • n: 总天数
    • d: 访问持续天数
    • k: 工作数量
    • 接下来是 k 行,描述每个工作对应的起止日期 [l_i, r_i]
  2. 访问安排

    • 罗宾的兄弟访问从某一天开始,持续 d 天,所有访问的天数必须在 1n 之间。
    • 母亲的访问也是如此。
  3. 目标

    • 找到兄弟的最佳开始日,使得他与最多的工作重叠。
    • 找到母亲的最佳开始日,使得她与最少的工作重叠。
    • 如果有多个选择,选择最早的那一天。

解题步骤

  1. 使用前缀和

    • 通过前缀和数组,我们可以高效地计算在任何区间内有多少个工作重叠。
    • 我们定义两个数组:ss(开始工作数量)和 es(结束工作数量)。
    • 对于每个工作 [l_i, r_i],我们在 ss[l_i] 增加 1,表示工作在 l_i 开始,在 es[r_i + 1] 减少 1,表示在 r_i 之后结束。
  2. 计算前缀和

    • 利用前缀和将 sses 转化为从第 1 天到第 n 天的累计工作开始和结束数。
  3. 滑动窗口

    • 计算每个可能的访问开始日,检查与之重叠的工作数量。
    • 对于每个可能的访问日 i,我们检查 ss[i] - es[i - d],得到区间 [i, i + d - 1] 的重叠工作数。
  4. 寻找最佳日期

    • 在遍历所有可能的开始日时,记录兄弟的最大重叠日和母亲的最小重叠日。

实现代码

下面是根据上述思路的实现代码,和你之前给出的代码基本一致:

#include <iostream>
#include <vector>using namespace std;void work() {int n, k, d;cin >> n >> d >> k;vector<int> ss(n + 1), es(n + 1);for (int i = 0; i < k; i++) {int a, b;cin >> a >> b;ss[a]++;es[b + 1]++; // 结束的下一天}for (int i = 1; i <= n; i++) {ss[i] += ss[i - 1];es[i] += es[i - 1];}int most = 0, robert = 1; // 最大重叠int least = 1e9, mrs = 1; // 最小重叠for (int i = 1; i <= n - d + 1; i++) {int cur = ss[i + d - 1] - es[i - 1];if (cur > most) {most = cur;robert = i;}if (cur < least) {least = cur;mrs = i;}}cout << robert << ' ' << mrs << "\n";
}int main() {int t;cin >> t;while (t--) work();return 0;
}

复杂度分析

  • 时间复杂度:O(n + k) 每个测试用例中,处理前缀和和遍历天数。
  • 空间复杂度:O(n) 用于存储前缀和数组。

总结

通过前缀和和滑动窗口技术,我们能够高效地计算每个可能的访问开始日与工作重叠的情况,从而找到最佳的开始日期。这种方法对于大规模数据的处理非常高效。

这行代码的目的是计算从第 i 天开始,持续 d 天的访问期间内,重叠的工作数量。

具体解释

  • ss[i + d - 1]:这是到第 i + d - 1 天(即访问结束的那一天)为止的开始工作数量的累计和。它表示在这 d 天期间(从第 i 天到第 i + d - 1 天)开始的所有工作数量。

  • es[i - 1]:这是到第 i - 1 天的结束工作数量的累计和。它表示在第 i 天之前结束的所有工作数量。因为母亲的访问在第 i 天开始,所以要排除在这之前结束的工作。

组合起来的含义

cur = ss[i + d - 1] - es[i - 1] 计算的是在访问期间 [i, i + d - 1] 内的所有重叠工作数。具体来说,它通过计算在结束日的工作开始数减去在开始日之前结束的工作数,从而得到该区间内独特工作的数量。

例子

假设有以下工作安排:

  1. 工作1:从第1天到第2天
  2. 工作2:从第2天到第3天
  3. 工作3:从第4天到第5天

如果你想计算从第2天开始持续2天的访问(即访问区间是第2天到第3天):

  • ss[3](第3天的开始工作数量)可能是2(工作1和工作2都在第2天开始)。
  • es[1](第1天结束的工作数量)可能是0(没有工作在第1天结束)。

因此:

  • cur = ss[3] - es[1] = 2 - 0 = 2,表示在第2天到第3天这段时间,有2个工作重叠。

这个计算方法确保了我们得到的是在这个访问期间内的独特工作数量,而不重复计算那些在访问之前已经结束的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

assembly2

汇编2 寄存器(不同架构不同) 8086中寄存器均为16位,可存放两个字节(1byte=8bit)。 通用寄存器AX,BX,CX,DX用来存储一般性的数据,被称为通用寄存器。二进制数据在寄存器中是低位存在低地址,高位存在高地址。也可将一个寄存器分为H,L(高8位低8位)来做8位存储器。字在寄存器…

shctf[Week3] 小小cms

看到首页面 了解到YzmCMS的版本,上网搜搜这个版本存在的漏洞 发现存在任意函数调用RCE的漏洞 https://blog.csdn.net/shelter1234567/article/details/138524342 根据文章直接抄payload,进入/pay/index/pay_callback目录下下面cat /flag即可,最终的payload为 out_trade_no[0…

数据采集与融合技术实践作业二

作业①:7日天气预报爬取 1. 作业代码与实现步骤 我们将在中国气象网爬取北京、上海、广州的7日天气预报,并将数据保存到数据库中。以下是实现步骤。 步骤详解打开中国天气网:在浏览器中访问中国天气网。搜索城市:输入“北京”并打开其天气页面。检查网页结构:使用浏览器的…

clickhouse安装部署使用

一、安装 下载地址https://packages.clickhouse.com/rpm/stable/上传文件到Linux中开始安装1、进入到文件所在目录cd /usr/local/soft/clickhouse-rpms/2、使用rpm命令安装sudo rpm -ivh *.rpm3、查看状态systemctl status clickhouse-server4、启动服务systemctl start clickh…

拦截器和过滤器的区别

在软件开发中,拦截器(Interceptors)和过滤器(Filters)是两种常用的用于处理请求和响应的机制,但它们在功能、使用场景和实现方式上有着明显的区别。主要区别有:1.设计模式和工作原理;2.实现方式和配置;3.功能和使用场景;4.控制流程和灵活性;5.性能和效率;6.选择和应…

Clickhouse的安装

一、官网下载 下载地址: https://packages.clickhouse.com/rpm/stable/ 一共需要下载这下面四个 注:一个页面没有的需要点击next进入下一个界面二、下载之后使用Xterminal打开所需要建立连接的虚拟机出现如下界面之后说明连接成功三、创建一个自己的文件夹,将先前下好的rpm文…

Oracle 排序

在Oracle中,使用 ORDER BY 语法按字符串进行排序 ASC或DESC关键字:指定升序或降序排序,默认情况下,排序是升序的。 NULLS FIRST 或 NULLS LAST 关键字:指定对空值的处理方式,默认情况下,空值排在最后。 -- 按升序排序,空值排在最后 SELECT column_name FROM table_name…

代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代

前置知识 二叉树的定义: struct BNode{int val;BNode* lchild;BNode* rchild;BNode():lchild(NULL),rchild(NULL){}BNode(int val){val=val;lchild=rchild=NULL;} };递归遍历文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路 题目链接:https://leetcode.cn/…