笔试题4 -- 除2!(k次机会偶数除2求最小和)

news2024/11/24 6:39:44

除2!(k次机会偶数除2求最小和)

文章目录

  • 除2!(k次机会偶数除2求最小和)
    • 读懂题目
    • 方案一(基于multiset实现 -- 超时)
    • 方案二(改进算法--基于 priority_queue 实现)
    • 总结

题目链接: 除2! (nowcoder.com)

题目描述

给一个数组,一共有 n 个数。你能进行最多 k 次操作。

每次操作可以进行以下步骤:

  • 选择数组中的一个偶数 ai,将其变成 ai/2 。

现在你进行不超过 k 次操作后,让数组中所有数之和尽可能小。请输出这个最小的和。

输入描述

  • 第一行输入两个正整数 n 和 k ,用空格隔开

  • 第二行输入 n 个正整数 ai

数据范围

1≤n≤100000,1≤k≤109,1≤ai≤109

输出描述

一个正整数,代表和的最小值。

读懂题目

注意点:

可以用于缩小最后数组中所有数相加和的唯一方法是:

  • 将数组中某个偶数减半
  • 而减半次数最多有k次

我们需要知道这个减半操作有两个限制项:

  1. 偶数
  2. 最多执行k次

如果减半次数没有用完,数组中已经没有偶数了,那么减半操作也只能停止。

方案一(基于multiset实现 – 超时)

//使用 multiset:50%案例超时
int main() 
{
    int n = 0, k = 0;
    cin >> n >> k;
    vector<int> v(n, 0);
    for(int i = 0; i < n; i++)
    {
        cin >> v[i];
    }

    multiset<int, greater<>> s(v.begin(), v.end());
    bool have_double_num = false;
    for(int i = 0; i < k; i++)
    {
        int big_num = 0;
        for(auto it = s.begin(); it != s.end(); it++)
        {
            if(*it % 2 == 0)
            {
                big_num = *it;

                have_double_num = true;
                s.erase(it);
                break;
            }
        }

        big_num /= 2;
        s.insert(big_num);

        if(!have_double_num) { break; }
    }
    
    size_t sum = 0;
    for(auto num: s)
    {
        sum += num;
    }
    cout << sum << endl;

    return 0;
}

提交截图:

在这里插入图片描述

复杂度分析:

  • 时间复杂度:由于 multiset 的每次插入和删除操作都是 O(log n),而且在最坏情况下,可能需要遍历整个 multiset 来找到偶数进行操作,因此总的时间复杂度是 O(n log n)。
  • 空间复杂度multiset 存储了所有的元素,因此空间复杂度是 O(n)。

方案二(改进算法–基于 priority_queue 实现)

代码示例:

// 使用 priority_queue: 通过全部用例
int main() {
    int n = 0, k = 0;
    cin >> n >> k;
    vector<int> v(n, 0);
    for(int i = 0; i < n; i++) {
        cin >> v[i];
    }

    // 使用优先队列来存储元素,最大的元素总是在队列的前面
    size_t sum = 0;
    priority_queue<pair<int, bool>> pq;
    for (int num : v) {
        if(num % 2 == 0)
            pq.push({num, num % 2 == 0});
        else
        {
            sum += num;
        }
    }

    while(k > 0 && !pq.empty()) {
        auto [big_num, is_even] = pq.top(); pq.pop();
        // 只有当最大的数是偶数时,我们才执行除以2的操作
        if(is_even) {
            pq.push({big_num / 2, (big_num / 2) % 2 == 0});
            k--;
        }
        else
        {
            sum += big_num;
        }
    }
    
    while(!pq.empty()) {
        sum += pq.top().first; pq.pop();
    }
    cout << sum << endl;

    return 0;
}

提交截图:

在这里插入图片描述

复杂度分析:

  • 时间复杂度priority_queue 的插入和删除最大元素的操作是 O(log n),并且由于您只处理最大的偶数,所以不需要遍历整个队列,总的时间复杂度是 O(k log n)。
  • 空间复杂度:与 multiset 类似,priority_queue 也存储了所有的元素,因此空间复杂度是 O(n)。

总结

​ 在解决这类优化问题时,选择合适的数据结构至关重要。虽然 multiset 提供了一个简单直观的解决方案,但它在处理大量数据时可能会导致超时。相比之下,priority_queue 提供了一个更高效的方法,特别是当操作次数 k 较大时。通过优先处理最大的偶数,我们能够显著减少所需的操作次数,从而在给定的时间限制内找到最小的和。

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

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

相关文章

【优质书籍推荐】《Effective Java》是人工智能的基石

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…

FileZilla安装下载与使用

实用工具系列 - FileZilla安装下载与使用_filezilla下载-CSDN博客文章浏览阅读4.4k次&#xff0c;点赞112次&#xff0c;收藏113次。一、概述二、下载三、安装四、使用教程_filezilla下载https://blog.csdn.net/Passerby_Wang/article/details/125298958?ops_request_misc%257…

湖仓一体(Lakehouse)架构的核心组件之存储层——Lakehouse 架构(三)

文章目录 前言Lakehouse 存储关键概念行存储与列存储基于存储的查询性能优化 Lakehouse 存储组件云储存文件格式Apache ParquetApache ORCApache Avro相似点和差异点 表格格式Apache HiveIceberg特性和优点 Apache Hudi特性和优点 Delta Lake特性和优点 相似点和差异点 总结 前…

抓住2024必应Bing国内广告推广的获客流量红利期

线上广告已成为企业获取客户流量的重要手段&#xff0c;作为全球领先的搜索引擎之一&#xff0c;必应Bing在国内市场拥有庞大的用户群体&#xff0c;为企业提供了一个宝贵的广告推广平台。展望2024年&#xff0c;必应Bing国内广告推广预计将进入一个获客流量的红利期&#xff0…

C语言知识(1) static修饰详解分享

1.前言 哈喽大家好啊&#xff0c;今天来给大家分享c中static的使用&#xff0c;希望能对大家有所帮助&#xff0c;请大家多多点赞&#xff0c;收藏支持我哦~ 2.正文 在讲解static之前&#xff0c;先给大家铺垫三个概念&#xff0c;方便大家理解。 2.1三则知识铺垫 2.1.1作…

Windows突然蓝屏解决办法

Windows突然蓝屏&#xff0c;然后重复开机没有用&#xff0c;但是能进入bios系统&#xff0c;证明内存和磁盘没事&#xff0c;用大白菜制作了PE系统盘制作过程&#xff08;之前一直都是用官方镜像制作&#xff0c;但是发现用大白菜制作可以对系统之前的磁盘里面重要的信息拷贝到…

Pixverse:开启文生视频与图生视频新纪元

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

“广进计划”中的特斯拉,加码驱动Robotaxi能否迎来新未来?

近期&#xff0c;特斯拉可以说是热搜上的常驻选手。 公司先是透露将于8月8日推出自动驾驶出租车Robotaxi&#xff0c;再是宣布将开启“广进计划”&#xff0c;在全球范围内裁员10%。官方资料显示&#xff0c;截至2023年末&#xff0c;特斯拉全球拥有超14万名员工&#xff0c;此…

OpenVINO安装教程 Anaconda版

从 Conda Forge 安装 OpenVINO™ Runtime 请注意&#xff0c;Conda Forge 发行版&#xff1a; 提供 C/C 和 Python API 不支持 NPU 推理 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; 使用 Anaconda…

CSS导读 (CSS的三大特性 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 五、CSS的三大特性 5.1 层叠性 5.2 继承性 5.2.1 行高的继承 5.3 优先级 小练习 五、CSS的三大特性 …

Windows电脑上能用的便签记事软件

上班族大多都依赖电脑进行办公&#xff0c;他们在电脑上完成各式各样的工作任务。因此&#xff0c;下载并安装高效率的软件成了提升工作效率的关键。其中&#xff0c;一款好的便签软件能够极大地帮助他们管理和跟踪任务。那么&#xff0c;有没有一款适合在电脑上使用的出色的便…

【c语言】自定义类型:结构体详解

目录 自定义类型&#xff1a;结构体 结构体类型的声明 结构体变量的创建和初始化 结构的特殊声明 结构的自引用 结构体内存对齐 对其规则 为什么存在内存对齐&#xff1f; 修改默认对⻬数 结构体传参 结构体实现位段 位段的内存分配 位段的跨平台问题 位段的应用…

github克隆报错:failed: The TLS connection was non-properly terminated.

github克隆gazebo_ros_control报错 fatal: unable to access https://github.com/ros-controls/gazebo_ros_control.git/: gnutls_handshake() failed: The TLS connection was non-properly terminated. sudo apt-get install ros-noetic-gazebo-ros-control git 克隆gazeb…

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(二)

上文介绍基于MINOnets神经网络架构加速多模态大模型的策略&#xff0c;本文将以Spinnaker2多核神经网络芯片EGRU架构为起点&#xff0c;覆盖存内计算架构&#xff0c;介绍新型计算架构在加速大模型推理的作用。SpiNNaker 2是一个设计用于大规模异步处理的多核神经形态芯片&…

如何封装Vue组件并上传到npm

前言 环境准备 1.注册npm账号&#xff1a;npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node&#xff0c;以下工作将在该环境下进行&#xff08;没有的小伙伴自行百度安装哈~&#xff09; 3.一下用到的环境版本 webpack&#xff1a;v5.1.4node&#xff1a;v…

每日一题---OJ题: 旋转数组

片头 嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组 emmm,看上去好像没有那么难,我们一起来分析分析 比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置 第一次轮转:将最后一个元素"7"放在第一个…

【spring】@Resource注解学习

Resource介绍 在Spring框架中&#xff0c;Resource 注解是一个JSR-250标准注解&#xff0c;用于自动装配&#xff08;autowiring&#xff09;Spring容器中的bean。Resource 注解可以用于字段、方法和方法参数上&#xff0c;以声明依赖注入。 Resource源码 Target({TYPE, FIE…

通付盾APP尽职调查报告:守护移动应用安全新篇章

在数字化浪潮席卷全球的今天&#xff0c;移动应用程序已经成为我们生活中不可或缺的一部分。无论是购物、社交、娱乐还是工作&#xff0c;我们几乎每天都在与各种各样的APP打交道。然而&#xff0c;随着APP的广泛应用&#xff0c;其安全问题也日益凸显&#xff0c;成为开发者和…

初学python记录:力扣928. 尽量减少恶意软件的传播 II

题目&#xff1a; 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接&#xff0c…