poj3253

挑战程序设计竞赛p47

注意到木板的分割是一个二叉树,每个最后的Li都是一个叶子节点,所以实质上就是构造哈夫曼树。用快排和插入排序来构造了一个哈夫曼树。


#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int N;
const int maxn=20005;
int L[maxn];
LL ans;
void Insert_Sort(int lo,int hi){
	for(int i=lo+1;i<hi;i++){
		for(int j=i;j>lo&&L[j]<L[j-1];j--){
			swap(L[j],L[j-1]);
		}
	}
}

int main(int argc, char const *argv[])
{
	cin>>N;
	for(int i=0;i<N;i++){
		cin>>L[i];
	}
	sort(L,L+N);
	for(int i=1;i<N;i++){
		int min=L[i]+L[i-1];
		ans+=(long long)min;
		L[i]=min;
		Insert_Sort(i,N);
	}
	cout<<ans<<endl;


	return 0;
}

要特别小心:插入排序是O(n^2),其实这里很可能是败笔

应该用一个堆来维护有序性质,这样是O(3NlogN)

你可能感兴趣的:(poj3253)