poj 3253---Fence Repair

来源:互联网 发布:excel多列重复数据筛选 编辑:程序博客网 时间:2024/05/16 14:38

优先队列的最有价值的地方不在于它将一个序列作了一个排列,而是这样一种数据结构它能够快速地将一个序列中最大或最小的几个元素选取出来


参考: http://blog.csdn.net/lyy289065406/article/details/6647423  的解法

首先整个问题的结构可以使用Huffman思想 , 问题是如何高效地构建Huffman code ,方法是使用 优先队列。
这样一种将问题转化的思想着实很精妙~


#include <iostream>using namespace std;__int64 sum = 0;void sift(__int64 r[], int k, int m){int i = k;int j = 2*i;while(j<=m){if(j<m && r[j] > r[j+1]) j++;if(r[i] < r[j]) break;else{__int64 temp = r[j];r[j] = r[i];r[i] = temp;i = j;j = i*2;}}return;}void compute(__int64 r[] , int m){__int64 delta = 0;delta += r[1];r[1] = r[m];sift(r,1,m-1);delta += r[1];r[1] = delta;sift(r,1,m-1);sum += delta;return;}int main(){    int n;      while(cin>>n)      {  __int64 * arr = new __int64[n+1];        for(int i = 1; i <= n ; i++){cin>>arr[i];}for(int i = n/2 ; i>=1 ; i-- ){sift(arr,i,n);}if(1 == n)sum+=arr[1];elsefor(int j = 0; j <= n-2 ; j++){compute(arr,n-j);}cout<<sum<<endl;    }  //system("pause");    return 0;  }


0 0