【秋招笔试】9.02阿里国际秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

✨ 本系列打算持续跟新 春秋招笔试题

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

🍒 本专栏已收集 90+ 套笔试题,笔试真题 会在第一时间跟新

🍄 题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。

🧩 备战秋招还没订阅的朋友们可以冲一下啦,当试题收集至 100 套后,价格会进行一波调整~

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

🍠 阿里国际秋招笔试,来啦!!!

🍥 本次难度中等偏上,其中最后一题是状态压缩DP,没接触过的小伙伴会有点懵,第二题也有坑,没保证数组有序

1️⃣ 按照题意模拟,简单

2️⃣ 也是一道模拟题,但要注意,输入的位置不一定是有序的

3️⃣ 状态压缩DP,拿到题看到数据范围,如果平时做题比较多的朋友们应该已经能猜到做法了

📚 01.LYA的魔法能量转换

问题描述

LYA 是一位魔法师,她发现了一种神奇的能量转换方法。在她的魔法世界中,每个魔法物品都有一个能量值。LYA 可以通过特殊的魔法操作来改变这些能量值。

对于一个能量值为 的魔法物品,LYA 可以使用以下魔法操作:

  1. 计算 的所有数位之和。
  2. 将这个和加到 上,得到一个新的能量值。

LYA 想知道,从一个初始能量值开始,通过多少次魔法操作可以达到另一个目标能量值,或者是否根本无法达到。

输入格式

输入只有一行,包含三个整数 )。

表示魔法世界中的最大能量值, 是初始能量值, 是目标能量值。

输出格式

如果可以从能量值 通过魔法操作达到能量值 ,输出一个整数,表示最少需要的魔法操作次数。

如果无法达到目标能量值,输出 "NO"(不包含引号)。

样例输入

13 5 13

样例输出

3

样例解释

从能量值 5 开始:

  1. 5 + (5) = 10
  2. 10 + (1 + 0) = 11
  3. 11 + (1 + 1) = 13

需要 3 次魔法操作达到能量值 13。

数据范围

题解

按照题意模拟即可

步骤如下:

  1. 初始化操作次数 ans 为 0。
  2. u 不等于 vuv 都不超过 n 时,执行以下步骤: a. 如果 u 小于 v,对 u 执行魔法操作。 b. 如果 u 大于 v,对 v 执行魔法操作。 c. 增加操作次数 ans
  3. 如果最终 u 等于 v,输出操作次数 ans
  4. 如果无法达到目标值(即 uv 超过了 n),输出 "NO"。

参考代码

  • Python
def digit_sum(num):
    """计算数字各位之和"""
    return sum(int(d) for d in str(num))

def solve(n, u, v):
    ans = 0
    while u != v and max(u, v) <= n:
        if u < v:
            u += digit_sum(u)
        else:
            v += digit_sum(v)
        ans += 1
    return str(ans) if u == v else "NO"

# 读取输入
n, u, v = map(int, input().split())

# 输出结果
print(solve(n, u, v))
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int u = scanner.nextInt();
        int v = scanner.nextInt();
        
        System.out.println(solve(n, u, v));
    }
    
    static String solve(int n, int u, int v) {
        int ans = 0;
        while (u != v && Math.max(u, v) <= n) {
            if (u < v) {
                u += digitSum(u);
            } else {
                v += digitSum(v);
            }
            ans++;
        }
        return u == v ? String.valueOf(ans) : "NO";
    }
    
    static int digitSum(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}
  • Cpp
#include <iostream>
#include <string>
using namespace std;

int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

string solve(int n, int u, int v) {
    int ans = 0;
    while (u != v && max(u, v) <= n) {
        if (u < v) {
            u += digitSum(u);
        } else {
            v += digitSum(v);
        }
        ans++;
    }
    return u == v ? to_string(ans) : "NO";
}

int main() {
    int n, u, v;
    cin >> n >> u >> v;
    cout << solve(n, u, v) << endl;
    return 0;
}

🪐 02.逃离机器城

问题描述

在未来的机器城中,一群可爱的精灵宠物被困在了一条长长的逃生通道里。为了逃离追捕他们的机器人,这些精灵宠物必须快速通过这条通道。

通道的长度为 ),机器人从位置 开始追赶,而精灵宠物从位置 )开始逃跑。当精灵宠物到达位置 时,就算成功逃脱。

然而,通道中布满了 个障碍物。精灵宠物需要花费时间来清除这些障碍物,而机器人则可以瞬间穿过。精灵宠物清除第 个障碍物需要 单位时间。无论是精灵宠物还是机器人,移动一格都需要 单位时间。

K小姐作为精灵宠物的训练师,她想知道她的宠物能否成功逃脱。你能帮助她计算出结果吗?

输入格式

第一行输入一个整数 ),表示测试数据的组数。

对于每组测试数据:

第一行输入三个整数 ),分别表示通道长度、障碍物数量和精灵宠物的初始位置。

第二行输入 个整数 ),表示每个障碍物的位置。保证障碍物不会出现在精灵宠物的初始位置,且障碍物之间不会重叠。

第三行输入 个整数 ),表示清除每个障碍物所需的时间。

保证所有测试数据中 的总和不超过

输出格式

对于每组测试数据,如果精灵宠物能够成功逃脱,输出一行 "YES",否则输出一行 "NO"。

样例输入

2
6 1 4
5
3
6 1 4
5
2

样例输出

NO
YES

数据范围

  • 所有测试数据中 的总和不超过

题解

模拟题 以下是几个关键点:

  1. 只需要关注精灵宠物前方的障碍物,因为它不会回头。

  2. 对于每个障碍物,计算精灵宠物到达该障碍物时,与机器人之间的距离差。

  3. 如果在某个障碍物处,机器人追上或超过了精灵宠物,那么精灵宠物就无法逃脱。

  4. 如果精灵宠物能够处理完所有障碍物且没有被追上,那么它就能成功逃脱。

具体实现步骤:

  1. 首先,对障碍物按位置排序。(重要!!)

  2. 找到第一个在精灵宠物前方的障碍物。

  3. 从这个障碍物开始,我们逐个计算精灵宠物处理完每个障碍物后,与机器人之间的距离差。

  4. 如果在任何时候距离差变为负数或零,说明机器人追上了精灵宠物,返回 "NO"。

  5. 如果精灵宠物处理完所有障碍物后仍未被追上,返回 "YES"。

参考代码

  • Python
def solve():
    m, n, k = map(int, input().split())
    a = list(map(int, input().split()))
    t = list(map(int, input().split()))
    
    # 将障碍物位置和清除时间组合并排序
    obstacles = sorted(zip(a, t))
    
    # 找到第一个在精灵宠物前方的障碍物
    idx = next((i for i, (pos, _) in enumerate(obstacles) if pos > k), -1)
    
    if idx == -1:
        return "YES"  # 没有障碍物在前方,可以直接逃脱
    
    last = obstacles[idx][0] - k + obstacles[idx][1]  # 初始距离差
    
    if last >= obstacles[idx][0] - 1:
        return "NO"  # 在第一个障碍物就被追上
    
    # 检查剩余的障碍物
    for i in range(idx + 1, n):
        last += obstacles[i][0] - obstacles[i-1][0] + obstacles[i][1]
        if last >= obstacles[i][0] - 1:
            return "NO"  # 被追上
    
    return "YES"  # 成功逃脱

T = int(input())
for _ in range(T):
    print(solve())
  • Java
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        while (T-- > 0) {
            solve(br);
        }
    }

    static void solve(BufferedReader br) throws IOException {
        String[] line = br.readLine()

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网春秋招笔试题汇总 文章被收录于专栏

这里收集了超全的互联网春秋招笔试题,欢迎大家的订阅,会持续跟新的

全部评论

相关推荐

1 3 评论
分享
牛客网
牛客企业服务