題目解析 裝箱問題

2021-10-05 23:52:01 字數 2000 閱讀 1302

時間限制: 1000 ms 空間限制: 262144 kb

題目描述

社會實踐是小學教育的重要組成部分,也是素質教育的乙個重要環節,老師經常帶同學們到工廠車間去參觀。一天,在班主任的帶領下,小明和他的同學來到了一間生產箱子的工廠,在工廠的倉庫裡有許多箱子,這些箱子被排成單獨的一行,每個箱子都有乙個體積,箱子的體積不大於1000個單位體積,體積小的可以放到體積大的箱子裡面。倉庫的經理想把一些箱子放進另一些箱子裡面,以便使得左端有更多連續的空餘位置。

基於安全因素的考慮,乙個箱子最多能夠裝下乙個比它小的箱子,並且只能嘗試將左端的前k個箱子裝入與之相鄰的k(即k+1~2*k之間)個箱子中。

你的任務是幫助經理計算一下,在滿足安全因素的情況下,左端有多少個箱子可以裝入與之相鄰的箱子中。

輸入第一行為乙個整數n,表示箱子的總個數。第二行是n個整數,表示這n個箱子的尺寸。

輸出乙個整數,表示左邊有多少個箱子可以裝入與之相鄰的箱子中,即題目中的最大的k值。

樣例輸入

102 2 1 4 3 2 5 4 2 3

樣例輸出

資料範圍限制

60%的資料n<=300

100%的資料n<=3000

提示前4個箱子可以放入5~8個箱子中。 其中一種放法為,第1箱子裝入第5個箱子中,第2個箱子裝入第8個箱子中,第3個箱子裝入第6個箱子中,第4個箱子裝入第7個箱子中,這樣左邊最多可以空出4個箱子位置,除此之外,沒有其它方式能使左邊空出更多的位置。

思路:我們需要看懂這個題目,這個題目的意思就是讓我們盡可能的騰出左邊的空間(注意,是左邊,不是右邊也不是中間)。如果還是有點不明白題意,那麼我們再結合提示分析樣例。

相信大家看完提示就可以明白題目的意思了,畢竟提示已經寫得很清楚了。

接下來簡單的想一想題目的做法,我們需要先一組一組試,怎麼試呢?這個問題我們先放在一邊,待會再解決。

現在我們需要解決乙個問題,我們一組一組指的是什麼呢?怎麼樣一組一組的迴圈呢?這個問題很簡單,我們需要分半,這可不是分半查詢,而是比如說n=8,那我們先試試將前八個分半試試能不能全部裝進去,然後再試試前六個分半,然後再試試前四個分半,再試試前兩個分半,以此類推。

我們現在知道了怎麼迴圈,那我們接下來需要解決的就是怎麼試。

怎麼試呢?我們需要先考慮個問題,相信大家第乙個想法肯定都是雙層迴圈吧,可是要考慮一下啊,雖是雙層迴圈,但是別忘了我們外面還有一層迴圈啊,也就是說有三層迴圈,還是有可能會超時的。

所以我們只能考慮單層迴圈的方法了,我們想想啊,我們是不是可以先排序,然後再用兩個變數乙個迴圈。但這樣對不對呢?很遺憾,不對,因為你如果排了序,那麼就會改變原有的序列,也就是說,第一次試它的序列順序是沒問題的,再往後數列就不一樣了,這樣答案也就不一樣了。

所以說我們不能修改原數列,必須給它找個「替身」,也就是說,我們需要複製一遍這個數列,然後再改變。

想到這裡,想必大家都明白了怎麼寫了吧,接下來,話不多說,上超全注釋**↓

#include

using

namespace std;

int n,k[

3001

],k1[

3001];

//箱子數量、k陣列、k陣列的「替身」

intmain()

if(n%2==

1)for(

int i=n/

2;i>=

1;i--

)sort

(k1+

1,k1+i+1)

;//排序

sort

(k1+i+

1,k1+i*2+

1);//排序

int g=

1,s=i*2;

//g是兩個變數中的乙個,s是檢視當前數列中的數字數量的

for(

int j=i+

1;j<=i*

2;j++

) s--

;//代表右邊的箱子數量減一 }if

(s==0)

} cout<<0;

//如果實在沒有辦法的話輸出0

}

裝箱問題 (洛谷題目)

題目描述 題目描述 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入 第一行是乙個整數v,表示箱子容量。第二行是乙個整數n,表示物品數。接下來n行,每行乙個正整數 不超過1000...

問題A 裝箱問題

思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...

pta基本題目集 裝箱問題 (20 分)

7 32 裝箱問題 20 分 假設有n項物品,大小分別為s 1 s 2 s i s n 其中s i 為滿足1 s i 100的整數。要把這些物品裝入到容量為100的一批箱子 序號1 n 中。裝箱方法是 對每項物品,順序掃瞄箱子,把該物品放入足以能夠容下它的第乙個箱子中。請寫乙個程式模擬這種裝箱過程,...