【每日一题】补档 CF1065 C. Make It Equal | 思维 | 中等

题目内容

原题链接

给定一个长度为 n n n 的数组 a a a ,每次操作可以选择一个数 x x x ,将所有大于 x x x 的数都下降为 x x x ,一次操作的下降总代价为 s s s ,要求 s ≤ k s\leq k sk ,问需要多少次操作使得数组 a a a 的所有数都相同。

数据范围

  • 1 ≤ n ≤ 2 ⋅ 1 0 5 1\leq n\leq 2\cdot 10^5 1n2105
  • n ≤ k ≤ 1 0 9 n\leq k\leq 10^9 nk109
  • 1 ≤ a i ≤ 2 ⋅ 1 0 5 1\leq a_i\leq 2\cdot 10^5 1ai2105

题解

朴素做法

首先使得所有数都相同,则使得所有值都成为 m i n ( a ) min(a) min(a)

所以考虑怎么将所有数都变成 m i n ( a ) min(a) min(a)

先对 a a a 排序,然后从最大的数开始依次将前面大的数往小了降。

从大的值开始往下依次枚举,看每次的 k k k 可以将前面多少数统一下降为一个数。

因为值域很小,所以可以直接枚举值域,这样的时间复杂度是 O ( m a x ( a ) + n ) O(max(a)+n) O(max(a)+n)

优化做法

如果值域很大,是否有与值域无关的做法。

其实这种题本身就应该值域无关,考虑当前最大的数为 c u r cur cur ,有 c n t cnt cnt 个值为 c u r cur cur 的数,下一步变成一个大于 a [ j ] a[j] a[j] 的最小的数 n x t nxt nxt

那么就有 ( c u r − n x t ) × c n t (cur-nxt)\times cnt (curnxt)×cnt 的代价将所有的 c u r cur cur 变成 n x t nxt nxt

所有相邻元素如果差距过大,考虑将统一下降的部分额外操作出来,保证我们每次循环的开始都是先用一个操作将整体的数做下降。

这样可以保证一次遍历就可以将所有元素都变成 m i n ( a ) min(a) min(a)

时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

代码

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

typedef long long ll;

void solve() {
    int n, k;
    cin >> n >> k;

    vector<int> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];

    sort(a.begin(), a.end(), greater<>());
    if (a.back() == a.front()) {
        cout << "0\n";
        return;
    }

    // 一次 k 能够支撑多少元素下降
    ll ans = 0;
    ll pre = 0;
    ll cnt = 0;
    ll cur = -1;
    for (int i = 0; i < n; ++i) {
        ll s = k;
        // 第一个 s 到某个 a[j - 1]
        int j = i;
        while (j < n && pre - cnt * a[j] <= s) {
            cur = a[j];
            pre += a[j];
            cnt += 1;
            j += 1;
        }

        // pre 肯定是一个统一的值
        if (j > i) {
            s -= pre - cnt * a[j - 1];
            // 然后把剩下部分给整了
            ll dec = s / cnt;
            cur = a[j - 1] - dec;
            pre = cur * cnt;
            ans += 1;
        }

        // pre -> a[j - 1]
        if (j < n) {
            ll single_op = k / cnt;
            ll single_decrease = single_op * cnt;
            ll cnt_op = (cur - a[j] - 1) * cnt / single_decrease;
            ans += cnt_op;
            cur = cur - cnt_op * single_op;
            pre = cur * cnt;
        }

        i = j - 1;
    }

    cout << ans << "\n";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T = 1;
    //cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}

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

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

相关文章

STM32自己从零开始实操01:原理图

在听完老师关于 STM32 物联网项目的所有硬件课程之后&#xff0c;就是感觉自己云里雾里&#xff0c;明明课程都认真听完了&#xff0c;笔记也认真记录&#xff0c;但是就是感觉学到的知识还不是自己。 遂决定站在老师的肩膀上自己开始设计项目&#xff0c;将知识变成自己的&am…

Lagent AgentLego 智能体应用搭建-笔记六

本次课程由Lagent&AgentLego 核心贡献者樊奇老师讲解【Lagent & AgentLego 智能体应用搭建】课程 课程视频&#xff1a;https://www.bilibili.com/video/BV1Xt4217728/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp2/agent 大语言模型的局限…

MybatisPlus开发业务接口

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 MybatisPlus开发业务接口 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主…

(mac)Promethues监控之mysqld_exporter(MySQL监控)

搭建Mysqld_exporterPrometheusGrafana监控系统 普罗米修斯是后端数据监控平台&#xff0c;通过Mysqld_exporter收集mysql数据&#xff0c;Grafana将数据用图形的方式展示出来 前提&#xff1a;已安装grafana和promethues 1.下载安装Mysql &#xff08;1&#xff09;启动MySQL…

回到唐诗宋词的创作现场,与伟大诗词人的灵魂共振

一、教程前言 本套唐诗宋词教程&#xff0c;大小3.15G&#xff0c;1个压缩文件。 二、教程目录 1-读诗&#xff0c;或许可以让我们更加接近自己.mp4 2-漠漠水田飞白鹭——王维的自然世界.mp4 3-不知何处是他乡——李白的酒徒生涯.mp4 4-桃花流水窅然去——李白的轻盈写作…

异步日志方案spdlog

异步日志方案spdlog spdlog 是一款高效的 C 日志库&#xff0c;它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录&#xff0c;提供多种日志级别&#xff0c;并允许用户将日志输出到控制台、文件或自定义的接收器。 多线程使用和同步、异步日志没有关系是…

信号带宽和上升沿时间

我们在抽取高速信号的S参数时避不开的一个环节是设置仿真带宽&#xff0c;经常听到有人讲要设置基频&#xff08;奈奎斯特频率&#xff09;的4倍or 5倍带宽&#xff0c;如果是这样&#xff0c;就有一个问题&#xff1a;如果是56Gbps的NRZ信号&#xff0c;那仿真带宽真要设置到1…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

NAT网络地址转换实验(思科)

华为设备参考&#xff1a;NAT网络地址转换实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

Markdown 对勾符号

Markdown中根号符号不完美&#xff0c;少了上面一横&#xff0c;更像对勾&#xff1a;√ 输入&#xff1a; 即可显示为&#xff1a; 在 youtrack 上面的 KB 页面&#xff0c;也适用。 Markdown 对勾符号 - 文档交付 - iSharkFlyMarkdown中根号符号不完美&#xff0c;少了上面一…

配置Trunk

1、实验目的 通过本实验可以掌握&#xff1a; Native VLAN 的含义和配置。IEEE802.1q 封装。Trunk 配置和调试方法。 2、实验拓扑 配置 Trunk 的实验拓扑如下图所示。 3、实验步骤 3.1 在交换机S1、S2上创建 VLAN 并把端口划分到相应的VLAN中 &#xff08;1&#xff09;配…

【网络安全】HTTP协议 — 基础

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、万维网的诞生与发展​编辑 1.万维网的诞生与发展 2.HTTP协议诞生与发展 二、网络基础 1.TCP/IP分层传输 1&#xff09;TCP/IP协议 2&#xff09;封装与拆封 …

初步认识Vscode

4.26初步认识Vscode &#xff08;一&#xff09;快捷键的使用 1. 打开控制端 ctrl ~2. 结束终端 ctrl c3. 多行同时对齐输出 按住shift alt 光标多选4. 多行同时任意位置输出 按住alt 光标单点你想要输入的位置5. 代码太长了&#xff0c;想混行编辑 alt z6. 打开设置控制…

C++ AVL树

文章目录 AVL树的概念AVL树基本框架AVL树的插入AVL树的插入&#xff08;无旋转&#xff09;AVL树的插入&#xff08;旋转操作&#xff09;单旋双旋旋转代码 上面我们知道二叉搜索树在特殊情况下查找的时间复杂度为O(N), 所以为了解决二叉搜索树不稳定的问题&#xff0c;我们引入…

关于OSPF报文学习

目录 一.OSPF学习补充 &#xff08;1&#xff09;OSPF报文头部 &#xff08;2&#xff09;ospf建立邻居关系 1.Hello报文——建立邻居关系 2.hello报文头部 &#xff08;3&#xff09;OSPF建立邻接关系 1.发送DD报文 2.DD报文头部 &#xff08;4&#xff09;关于DR,BD…

深入OceanBase内部机制:分区机制构建高可用、高性能的分布式数据库基石

码到三十五 &#xff1a; 个人主页 在数据库技术的发展历程中&#xff0c;随着数据量的不断增长和业务需求的日益复杂&#xff0c;如何高效地存储、查询和处理数据成为了关键挑战。OceanBase作为一款高性能、高可用的分布式关系数据库&#xff0c;通过其独特的分区机制&#xf…

03 spring-boot+mybatis+jsp 的增删改查的入门级项目

前言 主要是来自于 朋友的需求 项目概况 就是一个 用户信息的增删改查然后 具体到业务这边 使用 mybatis xml 来配置的增删改查 后端这边 springboot mybatis mysql fastjson 的一个基础的增删改查的学习项目, 简单容易上手 前端这边 jsp 的 基础的试题的增删改查 学习项…

Shell脚本学习记录

0.理解Linux文件权限 0.1 Linux安全性 用户的权限是通过创建用户时分配的用户ID(UID)来追踪的&#xff0c;UID是个数值&#xff0c;每个用户都有一个唯一的UID 0.1.1 /etc/passwd文件 Linux系统使用一个专门的文件/etc/passwd来匹配登录名与对应的UID值&#xff0c;该文件包…

本地体验最强开源模型Llama3+Qnw(支持Windows和Mac)

一键运行大模型本地软件&#xff08;含模型&#xff09;&#xff1a;点击下载 Meta放出Llama3模型了&#xff0c;也应该是这段时间里的一个科技大新闻了。 Llama一直都是开源大语言模型的领头羊驼。 而Llama3又是所有羊驼中最新的领头羊。 可以简单地来看一下官方的对比数据…

Open-Sora:开源版的Sora

项目简介 本项目希望通过开源社区的力量复现Sora&#xff0c;由北大-兔展AIGC联合实验室共同发起&#xff0c;当前我们资源有限仅搭建了基础架构&#xff0c;无法进行完整训练&#xff0c;希望通过开源社区逐步增加模块并筹集资源进行训练&#xff0c;当前版本离目标差距巨大&…
最新文章