4656. 技能升级

news2024/11/27 14:38:41

4656. 技能升级

https://www.acwing.com/problem/content/4659/

第十三届蓝桥杯省赛C++C组
在这里插入图片描述

算法标签:贪心;多路归并;二分

思路

  • 如果暴力来做的话,会将所有数放到一个集合里面排序,取前 m m m 项之和即可,但时间复杂度过高

  • 如何优化?考虑我们只需要取前 m m m 项,每一项范围在100万以内,可以使用二分来枚举一个分界点。由于分界点可能有多个(数值相等),我们只需要使大于x的数小于等于 m m m 即可

    • 答案所在区间 [ 0 , 1 e 6 ] [0, 1e6] [0,1e6]:由于 m m m 可能超过有效升级次数,即答案中可能包含0

    • 由于每个序列都是等差数列,知道分界点后能够在 O ( 1 ) O(1) O(1) 时间复杂度下求得该序列包含的个数以及总和。

      • 每个数列包含的个数: ceil((double) (a[i] - x) / b[i]) x为二分答案

      • 每个数列总和: int end = a[i] - b[i] * (t - 1); res += (ll)(a[i] + end) * t / 2;

        end 为末项

      • check(): 遍历每个大于x的数列首项,计算该数列包含的项数并累加,累加和小于等于 m m m 时合法

    • 最后遍历每个数列首项,计算包含次数和总和,但这并不是最终答案,因为可能存在包含x的项。设 c n t cnt cnt 为总次数, m − c n t m-cnt mcnt 则为包含x的项数,之前的求和再加上 x × ( m − c n t ) x \times (m-cnt) x×(mcnt) ( x x x为二分答案)就是最终答案。

    • 看到这里可能会有疑问,为什么大小等于 x x x的项数正好够用?即为什么 m − c n t ≤ p m-cnt \le p mcntp,设大小等于 x x x的项数为 p p p。因为在二分的时候已经确保 c n t ≤ m cnt \le m cntm c n t + p > m cnt + p > m cnt+p>m。如果 c n t + p ≤ m cnt + p \le m cnt+pm,则意味着 x − 1 x-1 x1 也是合法的,与二分单调性相悖。

C++代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;
typedef long long ll;
const int N = 1e5+10;
int n, m;

int a[N], b[N];

bool check(int x) {
    ll res = 0;
    for (int i = 0; i < n; i ++)
        if (a[i] > x) {
            res += ceil((double) (a[i] - x) / b[i]);
        }
    return res <= m;
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++) cin >> a[i] >> b[i];
    
    int l = 0, r = 1e6;
    
    while(l < r) {
        int mid = l + r >> 1;
        if (check(mid)) r = mid; // mid合法
        else l = mid + 1;
    }
    ll res = 0, cnt = 0;
    for (int i = 0; i < n; i ++)
        if (a[i] > l) {
            int t = ceil((double)(a[i] - l) / b[i]);
            cnt += t;
            int end = a[i] - b[i] * (t - 1); // 计算末项
            res += (ll)(a[i] + end) * t / 2; // 等差数列求和
        }
    printf("%lld\n", res + (ll)(m - cnt) * r); // 加上等于r的
    return 0;
}

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

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

相关文章

Vue3——第六章(侦听器:watch、watchEffect)

一、watch 基本使用 在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数&#xff1a; 二、侦听数据源类型 watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 get…

5.2、运输层端口号、复用与分用的概念

1、端口号 运行在计算机上的进程使用进程标识符PID\color{red}进程标识符 PID进程标识符PID来标志。 因特网上的计算机并不是使用统一的操作系统 不同的操作系统(windows&#xff0c;Linux&#xff0c;Mac OS)又使用不同格式的进程标识符\color{red}不同格式的进程标识符不同…

ThreadLocal 实战应用

1 什么是 ThreadLocal&#xff1f;ThreadLocal 是一个关于创建线程局部变量的类。通常情况下&#xff0c;我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal 创建的变量只能被当前线程访问&#xff0c;其他线程则无法访问和修改。ThreadLocal 在设计之初就是…

CDN简单介绍

CDN 介绍 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络&#xff0c;服务器的静态资源存在CDN服务器上&#xff0c;用户在最近的CDN服务器上获取资源。 从功能上看&#xff0c;典型的 CDN 系统由分发服务系统、负载均衡系统和运营管理系统组成。分发服务系…

我利用 ChatGPT 提高工作效率的 5 种方式

技术应该是我们的朋友&#xff0c;而不是我们的敌人ChatGPT 在 11 月的发布改变了世界。学校阻止该计划&#xff0c;程序员对他们工作中新发现的效率赞不绝口&#xff0c;而创意人员则怀疑他们的工作是否受到威胁。每个人都在想同一个问题&#xff1a;ChatGPT 的未来会是什么样…

IPS+ESPC联动实现安全中心接管

目录 一、IPS介绍 原理 功能 缺陷 二、ESPC介绍 原理 功能 三、NIPSESPC联动 实验目的 实验过程 一、IPS介绍 原理 如今内部威胁增多&#xff0c;外部攻击剧增&#xff0c;防火墙存在着一定的局限性&#xff0c;如&#xff1a;部署在边界处&#xff0c;更多的是对一些…

环境搭建(python+pycharm(anconda可选)

python下载 python下载&#xff0c;由于网站服务器在国外&#xff0c;所以打开可能有点慢&#xff0c;也可以使用国内的镜像网站&#xff08;因为我没有试过&#xff0c;有兴趣的可以去尝试下&#xff0c;此文章的后面部分会有临时换源的操作&#xff09; 电脑位数的查看 …

1277:【例9.21】方格取数——数字三角形模型

【题目描述】 设有NN的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a; 某人从图中的左上角A出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的B点。在走过的路上&…

如何实现同一IP的不同端口访问不同的网站

一&#xff0c;要求 1&#xff0c; 基于同一IP的不同端口访问不同的网站(可以通过域名去访问) ipport1 -> 对应一个域名 ipport2 -> 对应一个域名 使用域名1我应该访问到 ipport1对应的内容 使用域名2我应该访问到 ipport2对应的内容 2. …

阳了怎么居家办公?这4款远程办公软件你得知道!

疫情高峰期尚未过去&#xff0c;可是临近年底&#xff0c;各公司各部门都到了算绩效、追回款、清退结算的时候&#xff0c;大家都忙得根本脱不开身&#xff01;居家远程办公也不得不架起电脑回消息&#xff01; 本文给大家推荐4款超好用的远程办公软件&#xff0c;高效省事&am…

【机器学习 - 1】:knn算法

文章目录机器学习的概念和基础knn算法的实现过程封装knn算法总结机器学习的概念和基础 机器学习可以两类任务&#xff1a; 分类任务和回归任务 以机器学习本身来进行分类可分为&#xff1a; 监督学习 非监督学习 半监督学习 增强学习 监督学习&#xff1a;给机器的训练数据 有标…

android架构拆分方案-结构相关方案与技术

很纯、很生硬的架构技术归纳blog上上文https://blog.csdn.net/dongyi1988/article/details/128617738接上文https://blog.csdn.net/dongyi1988/article/details/128629011android架构官网地址https://source.android.google.cn/docs/core/architecture?hlzh-cnGKI&#xff08;…

VBO、VAO、EBO学习记录

在这里要先了解一下OpenGL的一个幕后大致运作流程&#xff0c;可以直接阅读OPENGL CN 我自己大概总结了一下就是&#xff0c;OpenGL本身就是一个巨大的状态机&#xff0c;我们通过更改状态变量(上下文)来告诉OpenGL如何去绘制图像。一般通过设置选项&#xff0c;修改缓冲来更改…

【网络与系统安全】国科大《网络与系统安全》复习大纲整理 + 考试记忆版

国科大《网络与系统安全》复习整理笔记 重在理解概念考试不算太难 文章目录一、新形势安全面临挑战和安全保障能力提升二、网络与系统安全的需求与目标三、自主与强制访问控制1.访问控制的基本概念2.访问控制的要素3.访问控制3种基本类型4.访问控制矩阵、访问控制列表、访问控制…

【Linux修炼】13.缓冲区

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 缓冲区的理解一. C接口打印两次的现象二. 理解缓冲区问题为什么要有缓冲区缓冲区刷新策略的问题所说的缓冲区在哪里&#xff1f;指的是什么缓冲区&#xff1f;三. 解释打印两次的现象四. 模拟实现五. 缓冲区与OS的关系一. …

ThinkPHP 表单验证使用

对前端或表单请求的数据&#xff0c;一定要做校验&#xff0c;而使用ThinkPHP 验证器则可以事半功倍。 可以使用validate助手函数&#xff08;或者封装验证方法&#xff09;进行验证。TP版本6.1。 目录 验证场景 验证器 创建验证器 定义规则和提示 数据验证 独立验证&…

Arbotix使用

内容学自赵虚左的视频及资料 需求描述: 控制机器人模型在 rviz 中做圆周运动 1.安装 Arbotix 方式1:命令行调用 sudo apt-get install ros-<<VersionName()>>-arbotix <<VsersionName()>> 替换成当前 ROS 版本名称 添加 arbotix 所需配置文件 # …

Web原型设计规范

上篇文章为大家介绍了app端在进行原型设计时的设计规范&#xff0c;本篇将继续为大家介绍一下Web端&#xff08;这里主要指网页端&#xff09;的设计规范。其实web端的设计规范并没有像app端那样多&#xff0c;因为展示的空间比较大&#xff0c;所有要求也就没有那么严苛。 电脑…

Spring_事务

事务的主要内容 事务定义 特性&#xff1a;ACID 并发时产生的问题 事务的隔离级别 锁 事务的传播特性 异常处理 超时 只读事务 TransactionDefinition 并发时产生的问题 一个数据库可以允许多个客户端同时访问&#xff0c;即并发的方式访问数据库。数据库中的同一个数据可能同…

2023年12306购票平台自动化购票终|解决乘客选择与车票提交(附自动化购票完整源代码与演示视频)

目录 一、说明 1.1、背景 1.2、说明 二、步骤 2.1、切换视角检索乘车乘客 2.2、选择乘客 2.3、关闭学生票选择界面 2.4、提交订单 2.5、选择座位并确认 三、完整代码与视频演示 3.1、完整源代码如下 3.2、视频演示代码运行 四、结果 4.1、代码运行结果 五、总结…