天翼云笔试 天翼云秋招 0915

笔试时间:2025年9月15日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

Tk和他的弟弟买了n种不同的零食(编号从1开始),每种零食各一个。给定整数k以及价格表,其中编号为i的零食价格为k^(i-1)。需要把全部零食在两人之间分配,满足:

  1. Tk(哥哥)的零食总价格不超过弟弟的总价格
  2. 在满足条件1下,两人的总价格差尽可能小

输入描述

  • 第一行输入一个整数T(1≤T≤10^4)代表数据组数
  • 每组数据输入两个整数n,k(1≤n≤10^9,1≤k≤10^9),分别表示零食种类数与价格倍率
  • 输出描述

  • 第一行输出整数m,表示Tk拿到的零食个数
  • 第二行输出m个整数,表示Tk拿到的零食编号(顺序任意)
  • 当m=0时,第二行留空
  • 样例输入

    2

    1 2

    5 1

    样例输出

    0

    2

    1 2

    样例说明:

    • 当n=1,k=2时,价格为2。若Tk拿走将违反不超过条件,因此m=0
    • 当n=5,k=1时,价格全为1,选取编号1,2得到2的价格,弟弟得到剩余3的价格

    参考题解

    解题思路:

    • 当k=1时,所有零食价格均为1,Tk应拿⌊n/2⌋个零食
    • 当k>1时,价格构成等比数列,最大的零食价格大于其他所有零食价格之和,因此Tk拿前n-1个零食,弟弟拿最大的

    C++:

    #include <iostream>
    using namespace std;
    
    void solve() {
        long long n, k;
        cin >> n >> k;
        
        long long m;
        if (k == 1) {
            m = n / 2;
        } else {
            m = n - 1;
        }
        
        cout << m << endl;
        if (m > 0) {
            for (long long i = 1; i <= m; i++) {
                if (i > 1) cout << " ";
                cout << i;
            }
            cout << endl;
        } else {
            cout << endl;
        }
    }
    
    int main() {
        int t;
        cin >> t;
        while (t--) {
            solve();
        }
        return 0;
    }
    

    Java:

    import java.util.*;
    
    public class Main {
        public static void solve(Scanner sc) {
            long n = sc.nextLong();
            long k = sc.nextLong();
            
            long m;
            if (k == 1) {
                m = n / 2;
            } else {
                m = n - 1;
            }
            
            System.out.println(m);
            if (m > 0) {
                for (long i = 1; i <= m; i++) {
                    if (i > 1) System.out.print(" ");
                    System.out.print(i);
                }
                System.out.println();
            } else {
                System.out.println();
            }
        }
        
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int t = sc.nextInt();
            while (t-- > 0) {
                solve(sc);
            }
            sc.close();
        }
    }
    

    Python:

    import sys
    
    def f():
        a, b = map(int, sys.stdin.readline().split())
        if b == 1:
            c = a // 2
        else:
            c = a - 1
        print(c)
        if c > 0:
            print(*list(range(1, c + 1)))
        else:
            print()
    
    def main():
        t = int(sys.stdin.readline())
        for _ in range(t):
            f()
    
    if __name__ == "__main__":
        main()
    

    第二题

    小红得到了一个长为n的数组a,判断是否对于所有

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

    2025 春招笔试合集 文章被收录于专栏

    2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

    全部评论

    相关推荐

    09-19 14:12
    武汉大学 golang
    并没有发笔试,只是顺延了两次,去看官网发现流程结束了
    无敌忍耐王:三个工作日没人捞就自动结束了
    投递美团等公司10个岗位
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

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