p6033 合併果子 加強版:
題目背景
本題除【資料範圍與約定】外與 p1090 完 全 一 致。
題目描述
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。
每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 (n - 1)(n−1) 次合併之後, 就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。
因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為 11,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。
例如有 33 堆果子,數目依次為 1,2,91, 2, 9。可以先將 11、22 堆合併,新堆數目為 33,耗費體力為 33。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為 1212,耗費體力為 1212。所以多多總共耗費體力為 3+12=153+12=15。可以證明 1515 為最小的體力耗費值。
輸入格式
輸入的第一行是乙個整數 n,代表果子的堆數。
輸入的第二行有 n 個用空格隔開的整數,第 i 個整數代表第 i 堆果子的個數 ai
輸出格式
輸出一行乙個整數,表示最小耗費的體力值。
輸入輸出樣例
輸入 #1
31 2 9
輸出 #1
15說明/提示
【資料規模與約定】
本題採用多測試點**測試,共有四個子任務。
subtask 1(10 points):1≤n≤8
subtask 2(20 points):1≤n≤103
subtask 3(30 points):1≤n≤105
subtask 4(40 points):1≤n≤107
對於全部的測試點,保證 1≤ai ≤105
【提示】
請注意常數因子對程式效率造成的影響。
請使用型別合適的變數來儲存本題的結果。
本題輸入規模較大,請注意資料讀入對程式效率造成的影響。
思路:
此題和p1090合併果子題意一樣但資料加強了,從1≤n≤10000變成1≤n≤107,所以之前用o(nlogn)的方法會爆,所以我們要用o(n)的方法,再看看題目資料,1≤ai ≤105,這題需要的是排序,於是可以想到o(n)時間的桶排,快速穩定,再用佇列將排好序的資料儲存,而另外乙個佇列存每次合併後新的資料,最後貪心選擇兩個佇列裡哪個隊首的數最小,加起來即可!
**:
#include
#include
using
namespace std;
queue<
int>q1;
queue<
long
long
>q2;
//注意這裡一定要開long long,不然會爆!
int n,x,p,q,vis[
1000001];
long
long ans,k;
//結果一樣要開long long!
intmain()
for(
int i=p;i<=q;
++i)
}for
(int i=
1;i++i)
elseif(
(q1.
front()
<=q2.
front()
&&q1.
size()
)||!q2.
size()
)else
ans+
=k;//ans記錄每一次所需的能量
q2.push
(k);
//記住要把新的數值推入隊裡
}printf
("%lld"
,ans)
;//記得ans是long long資料,要寫%lld
return0;
}
洛谷P1368 均分紙牌(加強版)
有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,紙牌總數必為 n 的倍數。可以在任一堆上取1張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,能移到編號為 2和n 的堆上 在編號為 n 的堆上取的紙牌,能移到編號為 n 1和1 的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。...
洛谷 P1120 小木棍 資料加強版
題目 小木棍 思路 搜尋 剪枝。外層迭代加深,列舉最小長度,用dfs判斷。dfs維護3個變數x,y,lst,即用了x根木棍,當前拼到了y,上一根木棍的長度為lst。然後列舉拼接的木棍就好。剪枝一 從大到小排序。剪枝二 如果y不為0,那麼列舉的木棍長不要大於lst,不然就會重複搜尋。剪枝三 如果y 0...
洛谷 P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。搜尋加剪枝 剪枝 1 使用桶排,因為長度不超過50。2 列舉的長度應該能...