腾讯笔试题20210321

一、链表树

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
64bit IO Format: %lld

题目描述

在牛牛所在的世界,链表是一种二叉树。
这是牛牛第一次见到链表树,他感到十分好奇,他提出了若干个问题,每次询问点x到根的路径上所有点分别是什么,你需要按照深度从小到大给出。

本题为核心代码模式,代码框中预设代码已经指定好类名、方法名、参数名,请勿修改或重新命名,直接返回值即可。

输入

{1, 2, 3, 4, 5, 6, 7}, [1, 2, 3, 4, 5, 6, 7]

输出

[{1}, {1, 2}, {1, 3}, {1, 2, 4}, {1, 2, 5}, {1, 3, 6}, {1, 3, 7}]

说明

p1

点1到根的路径上的个分别为{1}
点2到根的路径上的个分别为{1, 2}
点3到根的路径上的个分别为{1, 3}
点4到根的路径上的个分别为{1, 2, 4}
点5到根的路径上的个分别为{1, 2, 5}
点6到根的路径上的个分别为{1, 3, 6}
点7到根的路径上的个分别为{1, 3, 7}

备注

n n n 为树的点数,保证树的编号为 1 1 1~ n n n 的整数且互不相同
m m m 为问题个数
2 < = n < = 1 0 3 2 <= n <= 10^3 2<=n<=103
0 < = m < = 1 0 3 0 <= m <= 10^3 0<=m<=103

代码框预设代码

/*
 * class ListNode {
 *     int val;
 *     ListNode next = null;
 *
 *     public ListNode(int val) {
 *         this.val = val;
 *     }
 * }
 * /
/* class TreeNode {
 *     int val = 0;
 *     TreeNode left = null;
 *     TreeNode right = null;
 *
 *     public TreeNode(int val) {
 *         this.val = val;
 *     }
 * }
*/

class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 你需要返回m个指针,第i个指针指向一条链,表示第i个问题的答案
     *
     * @param root TreeNode类 指向链表树的根
     * @param b    int整型一维数组 表示每个问题是什么
     * @return ListNode类一维数组
     */
    public ListNode[] solve(TreeNode root, int[] b) {
        // write code here
    }
}

二、数字变换

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
64bit IO Format: %lld

题目描述

现在有一个数字 n n n ,你可以通过下面三种变换,使得这个数字变成 0 0 0 ,现在想知道最少需要变换几次
第一种变换: n = n − 1 n = n - 1 n=n1
第二种变换:若 n n n 是偶数,则 n = n / 2 n = n / 2 n=n/2
第三种变换:若 n n n 3 3 3的倍数, n = n / 3 n = n / 3 n=n/3.

本题为ACM模式,请通过代码实现题目,过程中的输入输出请自行处理,处理方式参考题目输入输出描述或左侧例题。

输入描述

输入第一行一个整数 T T T ,代表有 T T T 组测试数据
接下来 T T T 行,每一行为一个整数 n n n ,代表要变换的数。
1 < = T < = 100 , 1 < = n < = 2 ∗ 1 0 9 1 <= T <= 100,1 <= n <= 2*10^9 1<=T<=1001<=n<=2109

输出描述

对于每组测试数据,输出一个答案代表最少需要变换的次数。

输入

1
10

输出

4

说明

先执行第一种变换变成 9 9 9 ,执行第三种变换变成 3 3 3,执行第三种变换变成 1 1 1,最后执行第一种变换变成 0 0 0

三、小K的第K小元素

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
64bit IO Format: %lld

题目描述

K K K n n n 个数组,并且他将数组标号为 1 1 1~ n n n ,每个数组有若干个元素,现在他有 q q q 次询问,每次询问细节如下:

  • 首先给出一个整数 P P P ,之后跟着 P P P 个互不相同的数组下标,最后给出一个整数 k k k
  • 你需要告诉小 K K K ,将这 P P P 个数合并起来后的第 k k k 小元素是多少。

本题为ACM模式,请通过代码实现题目,过程中的输入输出请自行处理,处理方式参考题目输入输出描述或左侧例题。

输入描述

第一行包含一个正整数 n n n ( 1 < = n < = 1 0 5 ) (1<=n<=10^5) (1<=n<=105),表示有 n n n 个数组。
接下来 n n n 行,每一行包含:

第一个数首先给出一个正整数 m i m_i mi ( 1 < = m i < = 1 0 5 ) (1<=m_i<=10^5) (1<=mi<=105) ,表示第 i i i 个数组的长度。后面的 m i m_i mi 个正整数 a i , j a_{i,j} ai,j ( 1 < = a i , j < = 1 0 9 ) (1<=a_{i,j}<=10^9) (1<=ai,j<=109) ,表示第 i i i 个数组的第 j j j 个元素。
n + 2 n+2 n+2 行包含一个正整数 q q q ( 1 < = q < = 1 0 5 ) (1<=q<=10^5) (1<=q<=105) ,表示询问的次数。

接下来 q q q 行,每一行包含:
首先给出一个正整数 p i p_i pi ( 1 < = p i < = n ) (1<=p_i<=n) (1<=pi<=n) ,表示余姚合并的 p i p_i pi 个数组得个数。
接下来 p i p_i pi 个正整数, b i , j b_{i,j} bi,j ( a < = b i , j < = n ) (a<=b_{i,j}<=n) (a<=bi,j<=n) ,表示第 i i i 次询问需要合并的第 j j j 个数组下标。
接下来给出一个正整数 k i k_i ki k i k_i ki 比超过合并后数组的大小。
数据保证数组中元素总数小于等于 1 0 5 10^5 105 ,询问中的数组下标总数小于等于 1 0 5 10^5 105

输出描述

对于每一次询问,都需要输出一行包含一个正整数,表示合并后的数组中的第 k k k 小元素。

输入1

2
1 2
2 1 3
2
1 1 1
2 1 2 2

输出1

2
2

说明1

第一行输入为 n n n ,代表 2 2 2 个数组
接了来 2 2 2 行表示有 2 2 2 个数组,分别为数组 1 1 1 和数组 2 2 2 ,数组 1 1 1 的元素为 2 2 2 ,数组 2 2 2 的元素为 1 1 1 3 3 3
接下来的 2 2 2 表示询问 2 2 2
询问第 1 1 1 次需要合并的数组个数为 1 1 1 个,也就是不需要合并,选中的数组为 1 1 1 ,数组 1 1 1 只有 1 1 1 个元素,是 2 2 2 ,第 1 1 1 小的元素也就是 2 2 2 ,输出 2 2 2
询问第 2 2 2 次需要合并的数字个数为 2 2 2 个,需要合并,选中的数组为 1 1 1 2 2 2 ,数组 1 1 1 和数组 2 2 2 合并之后为: [ 2 , 1 , 3 ] [2, 1, 3] [2,1,3] ,第 2 2 2 小的元素也是 2 2 2 ,输出 2 2 2

输入2

5
1 1
2 2 3
3 5 10 6
4 4 58 2 1
5 1000000000 9 8 4 5
5
1 2 2
2 2 3 3
3 3 4 5 11
4 5 4 3 2 1
5 1 2 5 4 3 7

输出2

3
5
58
1
4

说明2

第一次询问,只包含第二个数组,一共有 2 2 2 个数: 2 2 2 3 3 3 。第 2 2 2 小的元素为 3 3 3
第三次询问,包含三个数组:第三、第四和第五,一共有 12 12 12 个数。其中第 11 11 11 小的元素为 58 58 58

四、奖金发放

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
64bit IO Format: %lld

题目描述

某公司年终共拿出 w w w 元,用于发放奖金(不需要用完)。公司共有 n n n 位员工(员工总数为奇数),每位员工贡献不同,发放奖金少于 x i x_i xi 元会让他自己不满意,多余 y i y_i yi 元会让其他员工不满意。现在想提出一种奖金发放的方案,使得所有人都满意,同时使得所有员工拿到奖金的中位数最大,求这个最大的中位数?

本题为ACM模式,请通过代码实现题目,过程中的输入输出请自行处理,处理方式参考题目输入输出描述或左侧例题。

输入描述

第一行两个正整数,员工数 n n n ,奖金总数 w w w;接下来 n n n 行:
每行两个正整数 ,每个人的奖金下限 x i x_i xi 、奖金上限 y i y_i yi

输出描述

一个正整数,最大的奖金中位数。

输入

3 20
8 10
1 4
7 9

输出

9

说明

三人分别发放奖金 10 10 10 1 1 1 9 9 9 元,奖金中位数最大为 9 9 9

备注

1 < = n < = 1 0 5 1 <= n <= 10^5 1<=n<=105
1 < = w < = 1 0 1 4 1 <= w <= 10^14 1<=w<=1014
1 < = x i < = y i < = 1 0 9 1 <= x_i <= y_i <= 10^9 1<=xi<=yi<=109
∑ x i < = w < = ∑ y i \sum^{}_{}{x_i} <= w <= \sum^{}_{}{y_i} xi<=w<=yi

五、整数倍购物

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
64bit IO Format: %lld

题目描述

牛牛陪牛妹来到商场购物,许久没有逛商场的牛妹像发了疯似的挑选了起来。很快,牛妹挑选出了一共 n n n 件商品,为了方便区别,给其编号为 1 , 2 , … , n 1, 2, …, n 1,2,,n ,其中,第 i i i 件商品的价格为 w i w_i wi

牛牛一算总额,惊人地发现,这些东西太贵了,如果全部买下的话,自己的全部身家就没了。于是,牛牛找了个借口说道:“今天银行卡限额了,只能刷出整 m m m 倍数的金额,这些东西,可能……”

还没等牛牛说完,牛妹就明白了牛牛的意思,于是,准备从这 n n n 件商品中挑选若干件,使其总额恰好为 m m m 的整倍数。

牛牛在一旁盘算着,如果牛妹足够聪明,在满足 m m m 的整倍数的条件下,她会挑出最大的商品总金额。

所以请你告诉牛牛,最坏的情况下,这次购物之后,他的全部身家还能剩下多少。

本题为ACM模式,请通过代码实现题目,过程中的输入输出请自行处理,处理方式参考题目输入输出描述或左侧例题。

输入描述

第一行输入一个正整数 T T T ( 1 < = T < = 1 0 5 ) (1 <= T <= 10^5) (1<=T<=105),代表测试数据的组数。

对于每组测试数据,第一次输入一个正整数 n , m n, m n,m ( 1 < = n < = 1 0 5 1 <= n <= 10^5 1<=n<=105 1 < = m < = 100 1<= m <= 100 1<=m<=100) ,依次代表牛妹第一次挑出的商品数量,以及牛牛编造的整 m m m 倍数金额。

题目保证,所有测试数据的 n n n 之和不会超过 1 0 6 10^6 106.

输出描述

对于每组测试数据,一行输出一个整数代表答案。

输入

2
3 3
3 6 9
3 5
9 6 3

输出

0
3

说明

第一组测试数据中, 3 + 6 + 9 = 18 3 + 6 + 9 = 18 3+6+9=18 ,是 3 3 3 的倍数,所以恰好花光牛牛的全部身家。

第二组测试数据中,要求总金额是 5 5 5 的备注,显然,对牛妹来说,最高花费的组合为 9 + 6 = 15 9 + 6 = 15 9+6=15 ,此时,牛牛的全部身家还剩下 3 3 3 .

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡人天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值