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; }
|