题目大意,总长度L的木板,分为n块,每块ai长度。切割的酬劳等于被切木板长度。
例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。
一开始想了个错误的方法,排序之后,递归的分割木板。每次把木板尽量均匀的切分两段。
#include <cstdio>
#include <algorithm>
int a[10001];
int total=0;
int cal( int L, int H, int length)
{
int num = H-L; //这个区间有几段木头
if( num == 3) return a[L] + a[L+1] + length;
if( num == 2) return length;
if( num <= 1) return 0;
int mid, leftLen=0;
for( mid=L; mid<H && leftLen<length/2; mid++ )
leftLen += a[mid];
if ( leftLen > (a[mid-1]+length)/2)
{
mid--;
leftLen -= a[mid];
}
return length+ cal(L, mid, leftLen) + cal(mid, H, length - leftLe