洛谷 P6033 合併果子 加強版

2021-10-10 13:51:17 字數 2175 閱讀 6718

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 列舉的長度應該能...