217. 柵欄修理 Fence Repair(挑戰程序設計競賽)

地址 https://www.papamelon.com/problem/217

我們的目標是將一塊完整的木板切割成 n 塊,每塊長度爲 L1,L2,L3...Ln 。
切割後各個木塊的長度總和與切割前的木板長度相等。
每次在一塊木板上切一刀,代價等於該木板的長度。例如:
在長度爲 21 的木板切一刀,變成兩塊木板,長度分別爲 5,16,所需代價爲 21
在長度爲 16 的木板上再切一刀,變爲兩塊木板,長度分別爲8,8,所需代價爲 16
爲了達到上述目標,求最小的切割代價是多少。

輸入
第一行是整數 
n(1≤n≤20000),表示要將原始木板切割成多少塊
接下來 n 行,每行一個整數,表示最終每塊小木板的長度,其中 
1≤Li≤50000
輸出
一行,一個整數,表示達到目標所需的最小代價
提示
2021/12/07 測試數據更新,以往通過代碼不會重判,可嘗試重新提交
樣例 1
輸入
3
8
5
8
輸出
34

根據題意分析 可以理解爲各個木塊碎片最後拼成一塊,每次拼裝的代價就是拼裝的長度

我們使用優先隊列進行各個木塊的長度存儲(兩個木塊合併後要彈出兩個木塊的長度並且加入合併後的木塊長度,重新排序)
根據li的數據範圍計算(20000X50000) 我們需要開longlong 變量
代碼如下

#include <iostream>
#include <algorithm>
#include <queue>
using  namespace std;

priority_queue<long long, vector<long long>, greater<long long>> q;
int n;
int main(){
    cin >>n;
    for(int i = 0;i < n;i++){
        int t ;cin >>t;
        q.push(t);
    }
    long long ans = 0;
    while(q.size() > 1){
        int a= q.top();q.pop();
        int b = q.top();q.pop();
        ans += a+b;
        q.push(a+b); 
    }
    cout<<ans<<endl;
    return 0;
}

我的視頻題解空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章