POJ3253 - Fence Repair

将一块很长的木板切割成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\n", 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 }

 

posted @ 2014-10-08 10:28  bournet  阅读(168)  评论(0编辑  收藏  举报