【秋招笔试】9.02阿里国际秋招(已改编)-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试
💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历
✨ 本系列打算持续跟新
春秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸
✨ 笔试合集传送们 -> 🧷春秋招笔试合集
🍒 本专栏已收集
90+
套笔试题,笔试真题
会在第一时间跟新🍄 题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。
🧩 备战秋招还没订阅的朋友们可以冲一下啦,当试题收集至
100
套后,价格会进行一波调整~🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞
🍠 阿里国际秋招笔试,来啦!!!
🍥 本次难度中等偏上,其中最后一题是状态压缩DP,没接触过的小伙伴会有点懵,第二题也有坑,没保证数组有序
1️⃣ 按照题意模拟,简单
2️⃣ 也是一道模拟题,但要注意,输入的位置不一定是有序的
3️⃣ 状态压缩DP,拿到题看到数据范围,如果平时做题比较多的朋友们应该已经能猜到做法了
📚 01.LYA的魔法能量转换
问题描述
LYA 是一位魔法师,她发现了一种神奇的能量转换方法。在她的魔法世界中,每个魔法物品都有一个能量值。LYA 可以通过特殊的魔法操作来改变这些能量值。
对于一个能量值为 的魔法物品,LYA 可以使用以下魔法操作:
- 计算 的所有数位之和。
- 将这个和加到 上,得到一个新的能量值。
LYA 想知道,从一个初始能量值开始,通过多少次魔法操作可以达到另一个目标能量值,或者是否根本无法达到。
输入格式
输入只有一行,包含三个整数 、 和 (;;)。
表示魔法世界中的最大能量值, 是初始能量值, 是目标能量值。
输出格式
如果可以从能量值 通过魔法操作达到能量值 ,输出一个整数,表示最少需要的魔法操作次数。
如果无法达到目标能量值,输出 "NO"(不包含引号)。
样例输入
13 5 13
样例输出
3
样例解释
从能量值 5 开始:
- 5 + (5) = 10
- 10 + (1 + 0) = 11
- 11 + (1 + 1) = 13
需要 3 次魔法操作达到能量值 13。
数据范围
题解
按照题意模拟即可
步骤如下:
- 初始化操作次数
ans
为 0。 - 当
u
不等于v
且u
和v
都不超过n
时,执行以下步骤: a. 如果u
小于v
,对u
执行魔法操作。 b. 如果u
大于v
,对v
执行魔法操作。 c. 增加操作次数ans
。 - 如果最终
u
等于v
,输出操作次数ans
。 - 如果无法达到目标值(即
u
或v
超过了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
数据范围
- 所有测试数据中 的总和不超过
题解
模拟题 以下是几个关键点:
-
只需要关注精灵宠物前方的障碍物,因为它不会回头。
-
对于每个障碍物,计算精灵宠物到达该障碍物时,与机器人之间的距离差。
-
如果在某个障碍物处,机器人追上或超过了精灵宠物,那么精灵宠物就无法逃脱。
-
如果精灵宠物能够处理完所有障碍物且没有被追上,那么它就能成功逃脱。
具体实现步骤:
-
首先,对障碍物按位置排序。(重要!!)
-
找到第一个在精灵宠物前方的障碍物。
-
从这个障碍物开始,我们逐个计算精灵宠物处理完每个障碍物后,与机器人之间的距离差。
-
如果在任何时候距离差变为负数或零,说明机器人追上了精灵宠物,返回 "NO"。
-
如果精灵宠物处理完所有障碍物后仍未被追上,返回 "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%内容,订阅专栏后可继续查看/也可单篇购买
这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的