将一块很长的木板切割成N块,长度分别为L1、L2、…、LN。每次切割需要的开销为当前木板的长度。求出将木板切割完最小开销是多少。
在N块木板中取最短和次短的相加,加到开销中,再在N-1块木板中重复此操作,直到木板数为1。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 #define MAX_N 30000 7 8 int N, L[MAX_N]; 9 10 11 int solve() 12 { 13 long long ans = 0; 14 //直到计算到木板为1块为止 15 while (N > 1) 16 { 17 //求出最短板mii1和次短板mii2 18 int mii1 = 0, mii2 = 1; 19 if (L[mii1] > L[mii2]) swap(mii1, mii2); 20 21 for (int i = 2; i < N; i++) 22 { 23 if (L[i] < L[mii1]) 24 { 25 mii2 = mii1; 26 mii1 = i; 27 } 28 else if (L[i] < L[mii2]) 29 { 30 mii2 = i; 31 } 32 } 33 34 //将两块木板合并 35 int t = L[mii1] + L[mii2]; 36 ans += t; 37 38 //mii1存储两块木板的和,mii2存储最后一块木板 39 if (mii1 == N-1) swap(mii1, mii2); 40 L[mii1] = t; 41 L[mii2] = L[N-1]; 42 N--; 43 } 44 45 printf("%lld ", ans); 46 } 47 48 int main() 49 { 50 cin >> N; 51 for (int i = 0; i < N; i++) 52 cin >> L[i]; 53 solve(); 54 return 0; 55 }