POJ 3253 fence repair 贪心法 huffman

要求最小的开销,意思就是最小的木块要放在最后切,这样最小的木块就会经历最多次数的累加。

而最小的木块 一定还伴随着另一块木块,同理它应该也是次小的木块。

所以就要每次找出最小的和次小的木块,将其加和,再将和累积到开销变量ans上。

如果每合成一次木块就要排序一次的话会有点耗时,而且每次合成完之后分别用来代表最小和次小木块的下标的mii1,mii2就已经废弃不用了,这时可以把他们的和K赋值给mii1,再把最后一个元素a[n-1]的值赋给a[mii2],在n-=1也就是数组缩小一个单位。(如若mii1==n-1那么就将mii1和mii2交换)随后再遍历数组比较得出最小与次小值即可。


值得一说- -这道题提交了好多次都是wrong answer又检查了好久算法也没有发现错漏,最后竟然发现是输出长度不够,必须要改成__int64 的声明和“%I64d”的输出



#include "stdio.h"
#include "stdlib.h"
#include "algorithm"
#include "iostream"

using namespace std;

void solve(int a[],int n);

main()
{
	int a[20500]={0},n,i,j;
	
	scanf("%d",&n);
	
	for(i=0;i
   
   
    
    1;n-=1){
		mii1=0,mii2=1;
		if(a[mii1]>a[mii2]){
			swap(mii1,mii2);
		}
		for(j=2;j
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值