• 美的的笔试


    第一题

    有两只猫咪和n条不同类型的鱼,每条鱼都只能被其中一只猫咪吃掉。
    下标为i处的鱼被吃掉的得分为:
    如果第一只猫咪吃掉,则得分为reward1[i]。如果第二只猫咪吃掉,则得分为reward[i]。
    给你一个正整数数组reward1 ,一个正整数数组reward2,和一个非负整数k。
    请你返回第一只猫咪恰好吃掉k条鱼的情况下,最大得分为多少。
    输入
    1 1 3 4
    4 4 1 1
    2
    输出
    15
    说明
    这个例子中,第一只猫咪吃掉第2和3条鱼(下标从0于始),第二只猫咪吃掉第0和1条鱼。
    总得分为4+4+3+4=15。
    15是最高得分。

    思路

    • 定义状态:令 dp[i][j] 表示第一只猫咪吃掉 i 条鱼,第二只猫咪吃掉 j 条鱼时,能得到的最大得分。
    • 初始状态:dp[0][0] = 0,表示两只猫咪都没有吃鱼时,得分为 0。
    • 状态转移:对于每一条鱼,有三种选择:
      • 第一只猫咪吃掉,那么 dp[i][j] = dp[i-1][j] + reward1[i+j-1],其中 reward1[i+j-1] 表示第 i+j-1 条鱼的得分。
      • 第二只猫咪吃掉,那么 dp[i][j] = dp[i][j-1] + reward2[i+j-1],其中 reward2[i+j-1] 表示第 i+j-1 条鱼的得分。
      • 两只猫咪都不吃,那么 dp[i][j] = dp[i][j],不改变得分。
      • 取这三种选择中的最大值作为 dp[i][j] 的值。
    • 最终答案:由于题目要求第一只猫咪恰好吃掉 k 条鱼,那么最终答案就是 dp[k][n-k],其中 n 是鱼的总数。
    #include 
    #include 
    using namespace std;
    
    int maxScore(vector<int>& reward1, vector<int>& reward2, int k) {
        int n = reward1.size(); // 鱼的总数
        vector<vector<int>> dp(k + 1, vector<int>(n - k + 1, 0)); // 定义状态数组
        for (int i = 0; i <= k; i++) { // 遍历第一只猫咪吃掉的鱼数
            for (int j = 0; j <= n - k; j++) { // 遍历第二只猫咪吃掉的鱼数
                if (i == 0 && j == 0) continue; // 跳过初始状态
                int score = 0; // 记录当前得分
                if (i > 0) { // 如果第一只猫咪可以吃掉一条鱼
                    score = max(score, dp[i-1][j] + reward1[i+j-1]); // 更新得分
                }
                if (j > 0) { // 如果第二只猫咪可以吃掉一条鱼
                    score = max(score, dp[i][j-1] + reward2[i+j-1]); // 更新得分
                }
                dp[i][j] = score; // 更新状态数组
            }
        }
        return dp[k][n-k]; // 返回最终答案
    }
    
    int main() {
        vector<int> reward1 = {1, 1, 3, 4}; // 输入第一只猫咪的得分数组
        vector<int> reward2 = {4, 4, 1, 1}; // 输入第二只猫咪的得分数组
        int k = 2; // 输入第一只猫咪要吃掉的鱼数
        cout << maxScore(reward1, reward2, k) << endl; // 输出最大得分
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    第二题

    在一个城市探险活动中,主办方标记了n个地标,编号为0到n-1。大壮需要从城市的起点(编号为0的地标)经过一系列地标后,最终到达终点(编号为n-1的地标)。每个地标都对应一个整数,表示从当前地标可以跳过的地标数量。例如,如果小王当前处于编号为i的地标,且地标对于的数字为nums[i],那么他可以选择跳过中间所有地标,而是直接去往任意编号为i用j的地标,其中0<=j= nums[i]且i+j

    输入描述:
    地标组数
    输出描述:
    经过最少地标数量

    示例1
    输入
    [2, 1, 1,3, 1, 3, 1, 4]
    输出
    4

    示例2
    输入
    [5, 4, 3, 2, 1,2, 3, 1, 1, 2]
    输出
    3

    思路:

    • 定义一个变量 ans 表示经过的地标数量,初始为 0。
    • 定义一个变量 cur 表示当前所在的地标编号,初始为 0。
    • 定义一个变量 next 表示下一步要跳到的地标编号,初始为 0。
    • 使用一个 while 循环,当 cur < n - 1 时,执行以下操作:
      • 遍历从 cur + 1 到 cur + nums[cur] 的所有地标编号 i,找出使得 i + nums[i] 最大的那个 i,并赋值给 next。
      • 如果 next == cur,说明无法继续前进,返回 -1 表示无解。
      • 否则,将 cur 更新为 next,并将 ans 加一。
    • 返回 ans 作为最终答案。

    根据以上思路,可以用 C++ 语言编写如下代码:

    #include 
    #include 
    using namespace std;
    
    int minLandmarks(vector<int>& nums) {
        int n = nums.size(); // 地标的总数
        int ans = 0; // 经过的地标数量
        int cur = 0; // 当前所在的地标编号
        int next = 0; // 下一步要跳到的地标编号
        while (cur < n - 1) { // 当没有到达终点时
            int max_jump = 0; // 记录能跳到的最远距离
            for (int i = cur + 1; i <= cur + nums[cur]; i++) { // 遍历所有可选的地标
                if (i + nums[i] > max_jump) { // 如果能跳得更远
                    max_jump = i + nums[i]; // 更新最远距离
                    next = i; // 更新下一步目标
                }
            }
            if (next == cur) return -1; // 如果无法前进,返回-1表示无解
            cur = next; // 更新当前位置
            ans++; // 更新经过的地标数量
        }
        return ans; // 返回最终答案
    }
    
    int main() {
        vector<int> nums = {2, 1, 1, 3, 1, 3, 1, 4}; // 输入地标组数
        cout << minLandmarks(nums) << endl; // 输出经过最少地标数量
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    聊聊 C++ 和 C# 中的 lambda 玩法
    Java项目:鞋子商城系统(java+SSM+JSP+layui+bootstrap+echarts+Mysql)
    Linux操作系统概述3——进程相关操作讲解(进程概念、xinetd守护进程、进程管理命令)
    基于FaceNet的人脸识别
    转录组&16S全长揭示热应激削弱鲟鱼的皮肤屏障功能的机制
    优炫数据库获“2022能源企业信息化产品技术创新”案例
    MySQL 数据库设计对性能的影响
    yolov7 onnx tensorrt 批量预测 全网首发
    【AGC】App Linking服务隐私合规问题
    PMP证书续证流程
  • 原文地址:https://blog.csdn.net/weixin_47895938/article/details/132764342