一、鏈表樹
時間限制: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}]
說明
點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\) .