蚂蚁春招-2023.3.16-组装电脑-中等

这篇具有很好参考价值的文章主要介绍了蚂蚁春招-2023.3.16-组装电脑-中等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

组装电脑

Problem Description

小红准备买一些零件来组装电脑。已知电脑一共有n个零件,每个零件有若干个型号。小红现在知道了每个型号的对应价格 a i a_{i} ai,以及性能 v i v_{i} vi。小红需要每个零件选择一个型号,在总价格不超过x元的前提下,最终的总性能尽可能大。你能帮帮她吗?

input

第一行输入两个正整数n和x,代表电脑的零件数量以及小红最大的预算。 接下来的3∗n行,每三行用来描述一个零件的不同型号的价格和性能。
对于每个零件,第一行输入一个正数m,代表该零件有多少种型号。 1 ≤ n , m ≤ 40 , 1 ≤ a i , v i , x ≤ 1 0 9 1≤n,m≤40,1≤a_i ,v_i ,x≤10^9 1n,m40,1ai,vi,x109
保证所有m之和不超过40,即所有零件的型号数保证所有m之和不超过40,即所有零件的型号数量之和不超过40种。

ouput

如果无法完成组装,则直接输出-1。否则输出一个正整数,代表最终最大的性能。

Sample Input

2 4
2
1 2
3 5
3
3 2 3
5 6 7

Sample Output

11文章来源地址https://www.toymoban.com/news/detail-493921.html

题目类型、难度、来源

  • 类型:动态规划
  • 难度:中等
  • 来源:蚂蚁春招-2023.3.16-组装电脑

总体思路:

  • 使用动态规划。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示买前i个零件,共花了j元(i从1算起,i=0表示没有零件)获得的最大性能。 c o s t [ i ] , p e r f [ i ] cost[i],perf[i] cost[i],perf[i]分别表示第i个零件的价格和性能。
  • 边界条件: d p [ 0 ] [ 0 ] = 0 dp[0][0] = 0 dp[0][0]=0,表示买前0个零件,共花了0元,性能是0。
  • 状态转移方程: d p [ i ] [ j ] = m a x { d p [ i − 1 ] [ j − c o s t [ 0 ] ] + p e r f [ 0 ] , d p [ i − 1 ] [ j − c o s t [ 1 ] ] + p e r f [ 1 ] , . . . } dp[i][j]=max{\{dp[i-1][j-cost[0]]+perf[0], dp[i-1][j-cost[1]]+perf[1], ...\}} dp[i][j]=max{dp[i1][jcost[0]]+perf[0],dp[i1][jcost[1]]+perf[1],...}
  • 这个方程比较难计算,我们可以反过来思考。
    • 可以使用 d p [ i ] [ j ] dp[i][j] dp[i][j]去更新 d p [ i + 1 ] [ j + c o s t [ 0 ] ] dp[i+1][j+cost[0]] dp[i+1][j+cost[0]] d p [ i + 1 ] [ j + c o s t [ 1 ] ] dp[i+1][j+cost[1]] dp[i+1][j+cost[1]]等等。
    • 具体的: d p [ i + 1 ] [ j + c o s t [ 0 ] ] = m a x ( d p [ i + 1 ] [ j + c o s t [ 0 ] ] , d p [ i ] [ j ] + p e r f [ 0 ] ) dp[i+1][j+cost[0]]=max(dp[i+1][j+cost[0]], dp[i][j]+perf[0]) dp[i+1][j+cost[0]]=max(dp[i+1][j+cost[0]],dp[i][j]+perf[0])
      • 这个公式需要不断被刷新,因为 d p [ i + 1 ] [ j + c o s t [ 0 ] ] dp[i+1][j+cost[0]] dp[i+1][j+cost[0]]的值和多个dp数组值有关。
  • 完成上述推理后,我们开始写代码,却发现x的只最大可以达到 1 0 9 10^9 109,如果使用传统方法做动态规划,这肯定就不行了,因为开不了那么大的数组。为了解决这个问题,我们可以使用map充当数组。

AC代码

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){
    int n, x;
    cin >> n >> x;
    int **cost = new int*[n];
    int **perf = new int*[n];
    int *comp_nums = new int[n];
    for (int t = 0; t < n; t++){
        cin >> comp_nums[t];
        cost[t] = new int[comp_nums[t]];
        perf[t] = new int[comp_nums[t]];
        for (int i = 0; i < comp_nums[t]; i++){
            cin >> cost[t][i];
        }
        for (int i = 0; i < comp_nums[t]; i++){
            cin >> perf[t][i];
        }
    }
    map<long long, long long> dp[45];
    dp[0][0] = 0;
    long long max_perf = -1;
    for (long long t = 0; t < n; t++){
        for (auto iter = dp[t].begin(); iter != dp[t].end(); iter++){
            long long dp_cost = iter->first;
            long long dp_perf = iter->second;
            for (long long i = 0; i < comp_nums[t]; i++){
                if (dp_cost+cost[t][i] <= x){
                    dp[t+1][dp_cost+cost[t][i]] = max(dp[t+1][dp_cost+cost[t][i]], dp_perf+perf[t][i]);
                    if ((t+1 == n) && (dp[t+1][dp_cost+cost[t][i]] > max_perf)){
                        max_perf = dp[t+1][dp_cost+cost[t][i]];
                    }
                }
            }
        }
    }
    cout << max_perf;
    return 0;
}
  • 更多大厂真题可以看:2023实习、秋招互联网大厂技术岗算法真题-刷题(持续更新)

到了这里,关于蚂蚁春招-2023.3.16-组装电脑-中等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 组装电脑基础知识之电源

    本系列文章是为准备自己组装台式机的小伙伴写的关于中央处理器CPU、主板、显卡等部分的参考资料。 计算机电源的主要作用是将普通交流电转为直流电,再通过斩波控制电压,将不同的电压分别输出给主板、硬盘等计算机部件。 提示:计算机电源决定着系统的稳定性和寿

    2024年02月16日
    浏览(34)
  • 多态案例三-电脑组装

    案例描述: 电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口测试时组装三台不同的电

    2024年02月13日
    浏览(29)
  • 电脑组装配件知识

    目录 1.电脑硬件基础知识 1.1CPU 1.2内存 ​编辑 1.3硬盘 1.4主板 1.5显卡 ​编辑 1.6显示器 1.7电源 1.8机箱 2.电脑硬件搭配及选购 2.1硬件搭配原则 2.2怎样查询软件或游戏配置 2.3配件购买注意事项 2.4搭配一台普通办公电脑 3.电脑组装 1.1CPU 1.1.2cpu分类 1.1.3CPU天梯       1.1.4cpu重要参

    2024年02月15日
    浏览(42)
  • 电脑组装教程分享!

    【看到身边的小伙伴组装一台自己的电脑,我也想试试。但是我对电脑并不是很熟悉,不太了解具体的电脑组装步骤,求一份详细的教程!】 电脑已经成为我们日常生活中不可或缺的一部分,但是有时我们需要根据我们自己的需求来组装电脑。在这篇文章中,小编将会分享详

    2023年04月13日
    浏览(48)
  • 电脑的组装与维护

    目录 1.常见概念 2.装机流程 3.电脑硬件选购指标 4.BIOS设置 5.硬盘分区 6.系统性能测试与常见维护 总结 常见的电脑类型 : 1.台式机,一种机箱、显示器、键盘及鼠标等设备分离独立的电脑。 2.笔记本,小型可携带高集成的个人电脑,同价位台式机更便宜。 3.一体机,将主机与

    2024年02月09日
    浏览(27)
  • 组装电脑基础知识之固态硬盘

    本系列文章是为准备自己组装台式机的小伙伴写的关于中央处理器CPU、主板、显卡等部分的参考资料。 固态硬盘(Solid State Disk或Solid State Drive,简称SSD),又称固态驱动器,是用固态电子存储芯片阵列制成的硬盘。 固态硬盘接口有SATA、PCIe、M.2三大常见接口类型,它们的区别

    2024年02月09日
    浏览(90)
  • 教你10分钟组装台式电脑

    今天麻哥的Dell主机到了。我们来看一下如何组装一台台式机。 1. 显示屏电源线 :插到插排上 2. 显示屏HDMI线 :插到主机上,HDMI插口 1. 主机电源线 :长得最大,插到插排上 2. 显示屏HDMI线 :插到主机上,HDMI插口(和一、2.是同一根) 3. 键盘线 :插到主机USB插口 4. 鼠标线

    2024年02月12日
    浏览(34)
  • 新手如何组装一台电脑

    首先,我们要先了解一台电脑的基本构成由哪些? CPU 显卡 主板 散热器 磁盘 内存 电源 机箱 显示器 通常我们需要根据自己对电脑的定位,根据需求和资金确定CPU和显卡 CPU主要有AMD和Intel。 Intel芯片单核能力足够强,标准版通常也能符合需求。AMD和Intel的CPU都是可以超频的,

    2024年02月08日
    浏览(37)
  • 记录第一次组装电脑遇到的坑

    京东装机大师配置清单如下:  主板cpu安装 本次安装拆了两次主板 原因1.主板侧面有个金属板需要从内部安装  2.cpu风扇有个板需要装在主板底下 显卡比较大个要最后装,要不然可能要拆好几次 装系统时候 u盘启动认不出来,他妈的是因为机箱上的usb口跳线没接上,插到主板

    2024年02月12日
    浏览(32)
  • 《c++》多态案例一.电脑组装

    在这里用了组装电脑中比较重要的零件分别是 CPU (处理器) Cvideocard (显卡) Memory (内存条)分别创建了3个类。 在每个类中都用到纯虚函数方便子类后续进行继承 纯虚函数是为了实现接口或抽象基类而设计的,强制派生类必须重写该函数。 1.创建变量 首先要在 Computer 类中

    2024年04月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包