【秋招笔试】2025.09.15电信&天翼云秋招笔试真题改编
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
电信
题目一:小兰的宝藏分配
1️⃣:理解几何数列的性质和分配策略
2️⃣:根据倍率m的不同值采用不同的最优策略
3️⃣:利用数学推导得出O(1)复杂度的判断方法
难度:中等
这道题目的关键在于理解几何数列的性质。当倍率m=1时,所有宝藏价值相等,采用平分策略;当m≥2时,利用几何数列后项大于前面所有项之和的性质,找到最优分配方案。通过数学分析,可以避免复杂的动态规划,直接得出答案。
题目二:小基的密码验证系统
1️⃣:分析异或运算的数学性质
2️⃣:通过固定一个变量推导出数组的必要条件
3️⃣:验证所有位置是否满足推导出的条件
难度:中等
这道题目结合了位运算和数学推理。通过固定j=1,将双重循环的条件转化为单一的线性条件a_i = k ⊕ i。关键是理解异或运算的性质,并通过数学变换简化问题。算法复杂度O(n),效率很高。
题目三:小毛的数学魔法
1️⃣:理解因子和的数学性质
2️⃣:发现只有完全平方数的因子和为奇数
3️⃣:将问题转化为完全平方数计数的奇偶性判断
难度:中等偏难
这道题目需要深入理解数论知识。通过分析质因数分解和因子和公式,发现只有完全平方数的因子和为奇数这一关键性质。然后将复杂的求和问题转化为简单的计数问题,最终实现O(1)的高效算法。需要处理大数开方的精度问题。
01. 小兰的宝藏分配
问题描述
小兰在一次探险中发现了 种不同的宝藏(编号从 1 开始),每种宝藏各有一个。根据古老传说,这些宝藏的价值遵循特殊的规律:给定整数
以及价值表
,其中
且对任意
有
。编号为
的宝藏价值为
。
现在小兰需要与她的好友小基平分这些宝藏(每件宝藏必须属于其中一人)。小兰作为发现者,希望自己拿到的宝藏总价值不超过小基的宝藏总价值;在满足上述条件下,小兰希望两人的总价值差尽可能小。请输出小兰最终拿到的宝藏编号(编号顺序任意)。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
输入格式
每个测试文件均包含多组测试数据。第一行输入一个整数
代表数据组数,每组测试数据描述如下:
在一行上输入两个整数,使用变量 、
指代,分别表示宝藏种类数与价值倍率。
除此之外,保证单个测试文件的 之和不超过
输出格式
对于每一组测试数据,新起一行输出:
-
第一行输出一个整数
,表示小兰拿到的宝藏个数;
-
第二行输出
个整数,要求两两不同,表示小兰拿到的宝藏编号(顺序任意)。
当 时,第二行留空。
样例输入
2
1 2
5 1
样例输出
0
2
1 2
| 样例 | 解释说明 |
|---|---|
| 样例1 | 当 |
| 样例2 | 当 |
数据范围
-
-
-
-
单个测试文件的
之和不超过
题解
这道题的核心是理解几何数列的性质。设总价值 ,小兰需要选出一个子集使得子集和
且尽量接近
。
价格满足几何序列 (
)。
情况1:
所有宝藏价值都是 1。取前 件即可让两人价值差最小;若
为偶数还能做到完全相等。
情况2:
几何比 时有:
因此小兰绝不可能拿走最后一件宝藏,因为单独这一件就已经超过一半。类似地,把最后一件交给小基后,前 件的总价严格不超过一半。若小兰再少拿一件,差距反而会变大,所以最佳方案就是拿走编号
到
的所有宝藏。
若 则小兰不能拿任何宝藏。
总结策略
:取前
件
且
:取 0 件
且
:取
到
号全部
算法复杂度 仅用于输出下标,逻辑判断为
。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
n, m = map(int, input().split())
if m == 1:
# 当m=1时,所有宝藏价值相等,取前floor(n/2)个
cnt = n // 2
print(cnt)
if cnt > 0:
res = [str(i) for i in range(1, cnt + 1)]
print(' '.join(res))
else:
print()
else:
if n == 1:
# 只有一个宝藏且m>1,不能取
print(0)
print()
else:
# m>1且n>1,取前n-1个宝藏
print(n - 1)
res = [str(i) for i in range(1, n)]
print(' '.join(res))
t = int(input())
for _ in range(t):
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
ll n, m;
cin >> n >> m;
if (m == 1) {
// m=1时所有宝藏价值相等
ll cnt = n / 2; // 取前floor(n/2)个
cout << cnt << "\n";
for (ll i = 1; i <= cnt; ++i) {
if (i > 1) cout << " ";
cout << i;
}
cout << "\n";
} else {
if (n == 1) {
// 只有一个宝藏且价值>1,无法满足条件
cout << "0\n\n";
} else {
// m>1且n>1,最优策略是取前n-1个
cout << n - 1 << "\n";
for (ll i = 1; i < n; ++i) {
if (i > 1) cout << " ";
cout << i;
}
cout << "\n";
}
}
}
return 0;
}
- Java
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(System.out);
public static void main(String[] args) throws IOException {
int testCase = Integer.parseInt(br.readLine());
while (testCase-- > 0) {
String[] parts = br.readLine().split(" ");
long numTreasure = Long.parseLong(parts[0]);
long multiVal = Long.parseLong(parts[1]);
if (multiVal == 1) {
// 当倍率为1时,所有宝藏价值相等
long takeCnt = numTreasure / 2;
out.println(takeCnt);
if (takeCnt > 0) {
List<String> resIds = new ArrayList<>();
for (long i = 1; i <= takeCnt; i++) {
resIds.add(String.valueOf(i));
}
out.println(String.join(" ", resIds));
} else
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
查看11道真题和解析