PKU3253Fence Repair解题报告

本文介绍了一种使用哈夫曼树解决将N块木板拼接为一块的问题的方法,目的是找到使得拼接总成本最低的方案。通过始终选择当前最短的两块木板进行合并,并计算合并后的成本,最终得到最低的总成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题可用哈夫曼树做,可简短时间,但用普通做法也可。

这样的话关键就是怎么求最小的情况,一开始以为是从大到小排序,每次取最大的数加进去就好,这是错的。。

把一块木板据成N块不好想的话,那么把这个过程反过来:把N块木板拼成一块,每拼一次所需代价是两块木板长度之和。这样就是很明显的哈夫曼树了。

每次从现有的木板中选取最短的两块木板,拼在一起变成新的一块后放回去,重复这个过程直到只剩一块木板。

用最小堆实现以上操作就不会超时。

普通做法

代码:

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *e1,const void *e2){
__int64 * t1=(__int64 *)e1;
__int64 * t2=(__int64 *)e2;
return *t1-*t2;
}
void main(){
int j,i,n;
__int64 count=0,count1=0,t[20011],temp;
scanf("%I64d",&n);
for(i=0;i<n;i++){
   scanf("%I64d",&t[i]);
   count+=t[i];
}
qsort(t,n,sizeof(t[0]),cmp);
for(i=1;i<n;i++){
   count1+=t[i]+t[i-1];
   t[i]=t[i]+t[i-1];
   temp=t[i];
   for(j=i+1;j<n;j++){
    if(t[j]<temp)
     t[j-1]=t[j];
    else
     break;
   }
   t[j-1]=temp;
}
printf("%I64d/n",count1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值