【秋招笔试】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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

落花情:同学,瞅瞅我司,医疗独角兽,校招刚开,名额有限,先到先得,我的主页最新动态,绿灯直达,免笔试~
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务