link
給定長為n
(1e5
)的陣列a([
1,1e9]
)湊數: 從中選擇任意多個元素的和
比如:a =[1
,2,5
] 他可以湊成:b =
問,b陣列中 形如[1,
2,3,
..., k]的連續遞增陣列的長度 最大值。
如圖中的答案為: 3 即[1,
2,3]
1, 首先會想到的乙個演算法,自然是揹包dp
即n件物品,每個物品選與不選。 得到陣列b。 最終,再從1開始遞增
這肯定是超時的。
2, 很重要的一點,所有元素均》=
1, 我們從小到大把元素存入map裡 [1
,3][
5,2]
....
1有3個,他可以組成[0,
1,2,
3]。 而下乙個元素是5,就說明: 4一定是無法湊出的!!
核心是,我們要得到這個[0,
1,2,
3]: 即當前可以湊成的,從0開始連續的序列
我們暫且用add來表示,[0,
1,2,
..., add] 為當前已經可以湊成的。2,
2]第一步:先放1個2, 即在[0,
1,2..
.add]的基礎上,再統一 +=2
變為: [0,
1,..
., add+2]
第二步:再放1個2,即在[0,
1,2,
...,add+
2]的基礎上,再統一 +=2
變為: [0,
1,..
., add+4]
4,2]
第一步:先放1個4, 即在[0,
1,2..
.add]的基礎上,再統一 +=4
變為: [0,
1,..
., add+4]
第二步:再放1個2,即在[0,
1,2,
...,add+
4]的基礎上,再統一 +=4
變為: [0,
1,..
., add+4]
綜上: 我們記錄乙個add, 表示當前已經可以湊成[0,
1,..
., add]
當遍歷到[a, b]元素時:
1,如果a >
(add +
1),說明 (add +
1)這個元素,一定湊不出!!!
2,否則, 執行: add +
=(a * b)
for(
auto i : a)
if(cont[1]
==0)return0;
int add =0;
// [0, 1, 2, ..., add]
for(
auto
&[a, b]
: cont)
add +
=(a * b);}
return add +
1;
歷屆試題 包子湊數 真 湊數)
問題描述 小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有n種蒸籠,其中第i種蒸籠恰好能放ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買x個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有x個包子。比如一共有3種蒸籠,分別能放3 4和5個包子。當顧客...
湊數字遊戲
problem description 金牌大圖神的演算法能力最近又有不少提高 為了杭電acm集訓隊的可持續性發展,現在他幫忙出了一道題目來訓練新隊員 給出4種數字583,1643,3233,5989,依次分別有n,m,k,g個,請找出用這些數字能湊成的和最接近l的數,如果有2個同樣接近的,請輸出較...
牛牛湊數字
題目 牛牛今天家裡要來客人,所以牛牛今天特意做了他最拿手的兩種蛋糕,但是他是乙個有潔癖的人,所以他在分蛋糕時,有如下幾個原則 1.他不希望乙個盤子裡出現兩種蛋糕 2.他希望每個盤子中都有蛋糕 3.他想讓裝有最少蛋糕數量的盤子中裝有的蛋糕數量盡可能多 示例1複製 5,2,3複製 1只有一種方法把蛋糕分...