騰訊筆試題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\) 為樹的點數,保證樹的編號為 \(1\)~\(n\) 的整數且互不相同
\(m\) 為問題個數
\(2 <= n <= 10^3\)
\(0 <= m <= 10^3\)

代碼框預設代碼

/*
 * 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\) ,你可以通過下面三種變換,使得這個數字變成 \(0\) ,現在想知道最少需要變換幾次
第一種變換:\(n = n - 1\)
第二種變換:若 \(n\) 是偶數,則 \(n = n / 2\)
第三種變換:若 \(n\)\(3\)的倍數,\(n = n / 3\).

本題為ACM模式,請通過代碼實現題目,過程中的輸入輸出請自行處理,處理方式參考題目輸入輸出描述或左側例題。

輸入描述

輸入第一行一個整數 \(T\) ,代表有 \(T\) 組測試數據
接下來 \(T\) 行,每一行為一個整數 \(n\) ,代表要變換的數。
\(1 <= T <= 100,1 <= n <= 2*10^9\)

輸出描述

對於每組測試數據,輸出一個答案代表最少需要變換的次數。

輸入

1
10

輸出

4

說明

先執行第一種變換變成 \(9\) ,執行第三種變換變成 \(3\),執行第三種變換變成 \(1\),最后執行第一種變換變成 \(0\)

三、小K的第K小元素

時間限制:C/C++ 1秒,其他語言 2秒
空間限制:C/C++ 262144K,其他語言 524288K
64bit IO Format: %lld

題目描述

\(K\)\(n\) 個數組,並且他將數組標號為 \(1\)~\(n\) ,每個數組有若干個元素,現在他有 \(q\) 次詢問,每次詢問細節如下:

  • 首先給出一個整數 \(P\) ,之后跟着 \(P\) 個互不相同的數組下標,最后給出一個整數 \(k\)
  • 你需要告訴小 \(K\) ,將這 \(P\) 個數合並起來后的第 \(k\) 小元素是多少。

本題為ACM模式,請通過代碼實現題目,過程中的輸入輸出請自行處理,處理方式參考題目輸入輸出描述或左側例題。

輸入描述

第一行包含一個正整數 \(n\) \((1<=n<=10^5)\),表示有 \(n\) 個數組。
接下來 \(n\) 行,每一行包含:

第一個數首先給出一個正整數 \(m_i\) \((1<=m_i<=10^5)\) ,表示第 \(i\) 個數組的長度。后面的 \(m_i\) 個正整數 \(a_{i,j}\) \((1<=a_{i,j}<=10^9)\) ,表示第 \(i\) 個數組的第 \(j\) 個元素。
\(n+2\) 行包含一個正整數 \(q\) \((1<=q<=10^5)\) ,表示詢問的次數。

接下來 \(q\) 行,每一行包含:
首先給出一個正整數 \(p_i\) \((1<=p_i<=n)\) ,表示余姚合並的 \(p_i\) 個數組得個數。
接下來 \(p_i\) 個正整數, \(b_{i,j}\) \((a<=b_{i,j}<=n)\) ,表示第 \(i\) 次詢問需要合並的第 \(j\) 個數組下標。
接下來給出一個正整數 \(k_i\)\(k_i\) 比超過合並后數組的大小。
數據保證數組中元素總數小於等於 \(10^5\) ,詢問中的數組下標總數小於等於 \(10^5\)

輸出描述

對於每一次詢問,都需要輸出一行包含一個正整數,表示合並后的數組中的第 \(k\) 小元素。

輸入1

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

輸出1

2
2

說明1

第一行輸入為 \(n\) ,代表 \(2\) 個數組
接了來 \(2\) 行表示有 \(2\) 個數組,分別為數組 \(1\) 和數組 \(2\) ,數組 \(1\) 的元素為 \(2\) ,數組 \(2\) 的元素為 \(1\)\(3\)
接下來的 \(2\) 表示詢問 \(2\)
詢問第 \(1\) 次需要合並的數組個數為 \(1\) 個,也就是不需要合並,選中的數組為 \(1\) ,數組 \(1\) 只有 \(1\) 個元素,是 \(2\) ,第 \(1\) 小的元素也就是 \(2\) ,輸出 \(2\)
詢問第 \(2\) 次需要合並的數字個數為 \(2\) 個,需要合並,選中的數組為 \(1\)\(2\) ,數組 \(1\) 和數組 \(2\) 合並之后為: \([2, 1, 3]\) ,第 \(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\)\(3\) 。第 \(2\) 小的元素為 \(3\)
第三次詢問,包含三個數組:第三、第四和第五,一共有 \(12\) 個數。其中第 \(11\) 小的元素為 \(58\)

四、獎金發放

時間限制:C/C++ 1秒,其他語言 2秒
空間限制:C/C++ 262144K,其他語言 524288K
64bit IO Format: %lld

題目描述

某公司年終共拿出 \(w\) 元,用於發放獎金(不需要用完)。公司共有 \(n\) 位員工(員工總數為奇數),每位員工貢獻不同,發放獎金少於 \(x_i\) 元會讓他自己不滿意,多余 \(y_i\) 元會讓其他員工不滿意。現在想提出一種獎金發放的方案,使得所有人都滿意,同時使得所有員工拿到獎金的中位數最大,求這個最大的中位數?

本題為ACM模式,請通過代碼實現題目,過程中的輸入輸出請自行處理,處理方式參考題目輸入輸出描述或左側例題。

輸入描述

第一行兩個正整數,員工數 \(n\) ,獎金總數 \(w\);接下來 \(n\) 行:
每行兩個正整數 ,每個人的獎金下限 \(x_i\) 、獎金上限 \(y_i\)

輸出描述

一個正整數,最大的獎金中位數。

輸入

3 20
8 10
1 4
7 9

輸出

9

說明

三人分別發放獎金 \(10\)\(1\)\(9\) 元,獎金中位數最大為 \(9\)

備注

\(1 <= n <= 10^5\)
\(1 <= w <= 10^14\)
\(1 <= x_i <= y_i <= 10^9\)
\(\sum^{}_{}{x_i} <= w <= \sum^{}_{}{y_i}\)

五、整數倍購物

時間限制:C/C++ 1秒,其他語言 2秒
空間限制:C/C++ 262144K,其他語言 524288K
64bit IO Format: %lld

題目描述

牛牛陪牛妹來到商場購物,許久沒有逛商場的牛妹像發了瘋似的挑選了起來。很快,牛妹挑選出了一共 \(n\) 件商品,為了方便區別,給其編號為 \(1, 2, …, n\) ,其中,第 \(i\) 件商品的價格為 \(w_i\)

牛牛一算總額,驚人地發現,這些東西太貴了,如果全部買下的話,自己的全部身家就沒了。於是,牛牛找了個借口說道:“今天銀行卡限額了,只能刷出整 \(m\) 倍數的金額,這些東西,可能……”

還沒等牛牛說完,牛妹就明白了牛牛的意思,於是,准備從這 \(n\) 件商品中挑選若干件,使其總額恰好為 \(m\) 的整倍數。

牛牛在一旁盤算着,如果牛妹足夠聰明,在滿足 \(m\) 的整倍數的條件下,她會挑出最大的商品總金額。

所以請你告訴牛牛,最壞的情況下,這次購物之后,他的全部身家還能剩下多少。

本題為ACM模式,請通過代碼實現題目,過程中的輸入輸出請自行處理,處理方式參考題目輸入輸出描述或左側例題。

輸入描述

第一行輸入一個正整數 \(T\) \((1 <= T <= 10^5)\),代表測試數據的組數。

對於每組測試數據,第一次輸入一個正整數 \(n, m\) (\(1 <= n <= 10^5\)\(1<= m <= 100\)) ,依次代表牛妹第一次挑出的商品數量,以及牛牛編造的整 \(m\) 倍數金額。

題目保證,所有測試數據的 \(n\) 之和不會超過 \(10^6\).

輸出描述

對於每組測試數據,一行輸出一個整數代表答案。

輸入

2
3 3
3 6 9
3 5
9 6 3

輸出

0
3

說明

第一組測試數據中,\(3 + 6 + 9 = 18\) ,是 \(3\) 的倍數,所以恰好花光牛牛的全部身家。

第二組測試數據中,要求總金額是 \(5\) 的備注,顯然,對牛妹來說,最高花費的組合為 \(9 + 6 = 15\) ,此時,牛牛的全部身家還剩下 \(3\) .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM