原题:
农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。请编写程序帮助农夫计算将木头锯成N块的最少花费。
代码:
#include
<stdio
.h
>
int a
[10000],s
=0;
void scan(int n
)
{
int i
=++s
;
for(;a
[i
/2]>n
;i
/=2)a
[i
]=a
[i
/2];
a
[i
]=n
;
}
int
delet(void)
{
int child
,parent
,x
,max
;
max
=a
[1];
x
=a
[s
--];
for(parent
=1;parent
*2<=s
;parent
=child
)
{
child
=parent
*2;
if((child
!=s
)&&(a
[child
]>a
[child
+1]))child
++;
if(x
<=a
[child
])break;
else a
[parent
]=a
[child
];
}
a
[parent
]=x
;
return max
;
}
int
main()
{
int n
,t
;
a
[0]=-1;
scanf("%d",&n
);
for(int b
=0;b
<n
;b
++)
{
scanf("%d",&t
);
scan(t
);
}
int sum
=0;
while(s
>1)
{
int u
=delet();
sum
+=u
;
int k
=delet();
sum
+=k
;
scan(u
+k
);
}
printf("%d\n",sum
);
return 0;
}