Problem
有 $N$ 塊畫布排成一列,並且目標將每一塊畫布變成不同顏色,每一次可以將一個區間塗成相同顏色,花費便是區間 $C_i$ 總和,請問最少花費為何。
Sample Output
Solution
每一次最多完成一個不同顏色的畫布,那麼著色解法看來就是二元樹,每一個畫布處於葉節點,因此最少花費就相當於編碼長度乘上葉權重最少。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 | #include <bits/stdc++.h> using namespace std; int main() {     int testcase;     scanf("%d", &testcase);     while (testcase--) {         int n, x;         long long t;         multiset<long long> S;         scanf("%d", &n);         for (int i = 0; i < n; i++)             scanf("%d", &x), S.insert(x);                      long long ret = 0;         for (int i = n-2; i >= 0; i--) {             long long a, b;             a = *S.begin();             S.erase(S.begin());             b = *S.begin();             S.erase(S.begin());             ret += a+b;             S.insert(a+b);         }         printf("%lld\n", ret);     }     return 0; }
 |