• POJ 3253 Fence Repair


    http://poj.org/problem?id=3253

    没切一块板子 消耗的钱 等与这块板子的长度

    要求最小钱的消耗 

    // 本题求最小money恰好构成一棵二叉树(霍夫曼?)
    //总之 money = ∑(i = 0 to n) 叶子*深度
    //每次选择 最小的两个叶子构成新的叶子

    具体解决的问题 --->>>如何获取 两个最小的叶子并插入 新的叶子 

    每次sort的 话O(n^2logn)会超时

    用prioroty_queue即可

    顺便普及一下 对优先队列 元素各种自定义排序的写法

    http://blog.sina.com.cn/s/blog_4e5157120100vn7b.html

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <vector>
     4 #include <algorithm>
     5 #include <queue>
     6 
     7 using namespace std;
     8 
     9 bool cmp(int x, int y)
    10 {
    11     return x < y;
    12 }
    13 vector<int> v;
    14 priority_queue< int,vector<int>,greater<int> > que;//小顶堆  tip : 如何自定义堆的排序
    15 //注意数据量 int 就错了 要long long 才行
    16 
    17 long long solve()
    18 {
    19     int m1, m2;
    20     int temp;
    21     long long sum = 0;
    22     while (que.size() > 1)
    23     {
    24         m1 = que.top();
    25         que.pop();
    26         m2 = que.top();
    27         que.pop();
    28         temp = m1+m2;
    29         sum += temp;
    30         que.push(temp);
    31     }
    32     return sum;
    33 }
    34 int main()
    35 {
    36     int n,temp;
    37     freopen("in.txt", "r", stdin);
    38     while(~scanf("%d", &n))
    39     {
    40         //v.clear();
    41         for (int i = 0; i < n; i++)
    42         {
    43             scanf("%d", &temp);
    44             que.push(temp);
    45         }
    46         printf("%lld
    ",solve());
    47     }
    48 }
  • 相关阅读:
    poj2478
    poj2376
    poj2192
    poj1062
    [HDOJ2639]Bone Collector II(第k优01背包)
    [HDOJ3466]Proud Merchants(贪心+01背包)
    [HDOJ5510]Bazinga(并查集)
    [POJ3264]Balanced Lineup(线段树,区间最值差)
    [HDOJ4325]Flowers(树状数组 离散化)
    [HDOJ5521]Meeting(最短路)
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6298509.html
Copyright © 2020-2023  润新知