备份比赛数据【算法赛】

news2025/3/25 22:54:23

0备份比赛数据【算法赛】 - 蓝桥云课

问题描述

蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1​,A2​,…,AN​ 分钟。

备份必须按编号顺序依次进行,即先第 1 台,再第 2 台,依此类推。每台电脑的备份需要工作人员持续操作,且必须安排在同一天内完成。例如,如果某台电脑的备份需要 5 分钟,那这 5 分钟必须安排在同一天,不能拆分到两天。如果当天剩余时间不足以完成某台电脑的备份,那就只能推迟到第二天进行。

每台电脑备份完成后,系统需要等待 B1​ 分钟才能开始下一台的备份。这段等待时间不需要工作人员操作,且可以跨天进行。例如,如果第 1 台电脑的备份只需在第 2 天开始后等待 10 分钟就能进行。

现在,组委会希望尽量缩短每天的工作时间,以便工作人员尽早下班休息。但上级有要求,所有电脑的备份必须在最多 T 天内完成。对此,请你帮助蓝桥杯组委会计算出每天最少需要安排的工作时间 M(M 最大不可超过 3600),以便所有电脑的备份能在 T 天内顺利完成。如果无论如何都无法满足条件,请直接输出 -1。

输入格式

第一行包含两个整数 N 和 T(1≤N,T≤105),分别表示电脑的数量和最多允许的天数。

第二行包含 N 个整数 A1​,A2​,…,AN​,表示每台电脑的备份时间。

第三行包含 N 个整数 B1​,B2​,…,BN​(1≤Bi​≤3600),表示每台电脑备份完成后需要等待的时间。

输出格式

输出一个不超过 3600 的整数 M,表示每天最少需要安排的工作时间,以确保所有电脑的备份任务能在 T 天内完成。若无法满足条件,则输出 -1。

样例输入

3 2
1 2 3
2 2 2

样例输出

5

样例说明

每天工作时间为5分钟时,备份任务将按以下方式进行:

  • 第1天:​

    • 第1台电脑的备份需要1分钟(第0~1分钟)。
    • 等待 B1​=2 分钟(第1~3分钟)。
    • 第2台电脑的备份需要2分钟(第3~5分钟)。
  • 第2天:​

    • 等待 B2​=2 分钟(第0~2分钟)。
    • 第3台电脑的备份需要3分钟(第2~5分钟)。

所有备份任务可在2天内完成。

思路:

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5; // 最大电脑数量+5的缓冲

int N, T; // 电脑数量和允许的最大天数
int a[MAXN], b[MAXN]; // a存储备份时间,b存储等待时间

/**
 * 检查给定每日工作时间M是否满足T天完成所有备份的条件
 * @param M 候选的每日工作时间
 * @return 是否满足条件
 */
bool check(ll M) 
{
    // 预检查:如果有任意备份时间超过M直接不可行
    for (int i = 1; i <= N; ++i) 
    {
        if (a[i] > M) // 备份时间超过单日容量
        {
            return false;
        }
    }

    ll prev_end = 0; // 上一个备份的结束时间(绝对时间)
    ll prev_B = 0;   // 上一个备份后的等待时间(初始为0)
    ll max_day = 0;  // 记录过程中的最大天数

    // 遍历所有电脑进行备份模拟
    for (int i = 1; i <= N; ++i) 
    {
        // 计算当前备份的开始时间 = 前一个结束时间 + 前一个的等待时间
        ll s_i = prev_end + prev_B; 
        // 计算所在天数:总时间除以每日时长向下取整
        ll d_i = s_i / M;           
        // 计算当前天的结束时间:下一天开始前的时间点
        ll day_end = (d_i + 1) * M; 

        ll current_day; // 当前备份实际所在天数
        ll end_i;       // 当前备份的结束时间

        // 判断能否在当天完成
        if (s_i + a[i] <= day_end) 
        {
            // 当天可完成:结束时间直接累加
            end_i = s_i + a[i];
            current_day = d_i;
        } 
        else 
        {
            // 需要跨天:天数+1,结束时间在下一天的开始时刻+备份时间
            current_day = d_i + 1;
            end_i = current_day * M + a[i];
        }

        // 更新最大天数(注意天数从0开始计数)
        if (current_day > max_day)
        {
            max_day = current_day;
        }
        
        // 保存当前备份的结束时间和产生的等待时间
        prev_end = end_i;
        prev_B = b[i]; // 记录当前备份后的等待时间(给下一个备份用)
    }

    // 最终天数计算:max_day是最后一个备份所在天数,实际需要+1天(天数从0计数)
    // 例如:max_day=0 表示第1天完成
    return (max_day + 1) <= T; 
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // 加速输入输出

    // 读取输入
    cin >> N >> T;
    for (int i = 1; i <= N; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= N; ++i) {
        cin >> b[i];
    }

    // 二分查找初始化(左开右闭区间)
    ll left = 0;      // 不可行下界
    ll right = 3601;  // 可行上界(包含3600)
    ll ans = -1;      // 最终结果

    // 特殊二分模板:寻找第一个可行的M
    while (left + 1 != right) 
    {
        ll mid = (left + right) / 2;
        if (check(mid)) 
        {
            // 当前mid可行,尝试寻找更小的解
            right = mid; // 移动右边界
        } 
        else 
        {
            // 当前mid不可行,需要增大
            left = mid; // 移动左边界
        }
    }

    // 结果处理(注意边界)
    if (right <= 3600) 
    {
        cout << right << endl;
    } 
    else 
    {
        cout << -1 << endl; // 无解或超出限制
    }

    return 0;
}

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

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

相关文章

[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM

本文来源于团队的超辉老师&#xff0c;其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色&#xff0c;攻击者可在Azure VM中远程执行命令&#xff0c;创建后门账户&#xff0c;实现横向移动。文中详述了攻击步…

vue3,element-plus 表格单选、多选、反选、全选

准备 定义数据 // 表格 const table ref(); // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); // 表格选集 const tableSelection ref<User[]>([]); // 表格选择行 const tableSelectedRow ref<User>…

【Linux】从开发到系统管理深入理解环境变量

文章目录 前言一、环境变量概念1.1 为什么需要环境变量&#xff1f;1.2 环境变量的本质特征 二、环境变量PATH2.1 PATH的运作机制2.2 常见环境变量及其作用2.3 环境变量操作指南 三、再谈环境变量3.1main函数命令行参数解析3.2 环境变量的继承机制3.3 本地变量与内部构建命令 总…

【CGE】社会核算矩阵构建(一):SAM基本结构

【CGE】社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构 社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容&#xff08;1&#xff09;社会…

Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Mysql数据库规范 一、Ol…

第三讲 | C/C++内存管理完全手册

C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数&#xff08;重点&#xff09;五、new和delete的实现原理…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…

纯vue手写流程组件

前言 网上有很多的vue的流程组件&#xff0c;但是本人不喜欢很多冗余的代码&#xff0c;喜欢动手敲代码&#xff1b;刚开始写的时候&#xff0c;确实没法下笔&#xff0c;最后一层一层剥离&#xff0c;总算实现了&#xff1b;大家可以参考我写的代码&#xff0c;可以拿过去定制…

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…

django入门教程之request和reponse【二】

接上节&#xff1a;入门【一】 再创建一个orders子应用&#xff0c;python manager.py startapp orders&#xff0c;orders目录中新建一个urls.py文件。结构如图&#xff1a; 通过上节课&#xff0c;我们知道在views.py文件中编写函数时&#xff0c;有一个默认入参request&…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

【Linux】VMware17 安装 Ubuntu24.04 虚拟机

目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址&#xff1a;ubuntu-24.04.2-des…

WPS宏开发手册——JSA语法

目录 系列文章2、JSA语法2.1、打印输出2.2、注释2.3、变量2.4、数据类型2.5、函数2.6、运算符2.7、比较2.8、if else条件语句2.9、for循环2.10、Math对象&#xff08;数字常用方法&#xff09;2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…

word中指定页面开始添加页码

第一步&#xff1a; 插入页码 第二步&#xff1a; 把光标放到指定起始页码处 第三步&#xff1a; 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步&#xff1a; 设置页码格式&#xff0c;从1开始 第五步&#xff1a; 删掉不要的页码&#xff0c…

Python实现deepseek接口的调用

简介&#xff1a;DeepSeek 是一个强大的大语言模型&#xff0c;提供 API 接口供开发者调用。在 Python 中&#xff0c;可以使用 requests 或 httpx 库向 DeepSeek API 发送请求&#xff0c;实现文本生成、代码补全&#xff0c;知识问答等功能。本文将介绍如何在 Python 中调用 …

文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能

Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来&#xff0c;Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能&#xff0c;使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中&#xff0c;我们通过使…

19,C++——11

目录 一、 C11简介 二、 新增的列表初始化 三、 新增的STL容器 四、 简化声明 1&#xff0c;auto 2&#xff0c;decltype 3&#xff0c;nullptr 五、右值引用 1&#xff0c;左值引用和右值引用 2&#xff0c;两种引用的比较 3&#xff0c;左值引用的使用场景 4&…

风尚云网|前端|前后端分离架构深度剖析:技术革新还是过度设计?

前后端分离架构深度剖析&#xff1a;技术革新还是过度设计&#xff1f; 作者&#xff1a;风尚云网 在数字化转型浪潮中&#xff0c;前后端分离架构已成为现代Web开发的主流模式。但这项技术真的是银弹吗&#xff1f;本文将从工程实践角度&#xff0c;剖析其优势与潜在风险&am…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下&#xff0c;CMS平台作为企业内容管理的核心载体&#xff0c;其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现&#xff0c;模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…