# 【CSES】1161. Stick Divisions ## [題目連結](https://cses.fi/problemset/task/1161/) ## **時間複雜度** * $O(NlogN)$ ## **解題想法** 這題的想法很簡單,就是將過程反向操作,變成從最小的開始一個一個往 $x$ 合成,貪心的部分是每次取最小的的兩個並把他們結合之後,把結合出的長度在丟回待處理區,直到合成出長度是 $x$ 的木條 ## **完整程式** ```cpp= /* Question : CSES 1161. Stick Divisions */ #include<bits/stdc++.h> using namespace std; #define opt ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define mem(x, value) memset(x, value, sizeof(x)); #define pii pair<int, int> #define pdd pair<double, double> #define f first #define s second #define int long long const auto dir = vector< pair<int, int> > { {1, 0}, {0, 1}, {-1, 0}, {0, -1} }; const int MAXN = 2e5 + 50; const int Mod = 1e9 + 7; int x, n, res, tmp, a, b; multiset<int> stick; signed main(){ opt; cin >> x >> n; for( int i = 0 ; i < n ; i++ ){ cin >> tmp; stick.insert(tmp); } res = 0; while( stick.size() > 1 ){ a = *stick.begin(); stick.erase(stick.begin()); b = *stick.begin(); stick.erase(stick.begin()); res += (a+b); stick.insert(a+b); } cout << res << "\n"; } ```