zoukankan      html  css  js  c++  java
  • poj3253(Fence Repair)

    题目地址:Fence Repair

    题目大意:

        一个农夫有个长度一定的木板,他想切成N段长度一定的木板,每次切割需要一定的费用,这个费用就是当前木板的长度,求切成N段农夫花费最小的费用。

    解题思路:

        因为每次切割是切成两段,而且要求花费的最少,这样可以逆向思想从最小的两段木板算起,这样加到最后,一定是花费最小的切割。利用的是Huffman思想,但是用的是优先队列,即每次将最小的两段长度优先加和,然后在放进队列里排队,再选取较小的两个,以此类推。

    代码:

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <sstream>
     4 #include <cstdlib>
     5 #include <cstring>
     6 #include <cstdio>
     7 #include <string>
     8 #include <bitset>
     9 #include <vector>
    10 #include <queue>
    11 #include <stack>
    12 #include <cmath>
    13 #include <list>
    14 #include <map>
    15 #include <set>
    16 using namespace std;
    17 /***************************************/
    18 #define ll long long
    19 #define int64 __int64
    20 /***************************************/
    21 const int INF = 0x7f7f7f7f;
    22 const double eps = 1e-8;
    23 const double PIE=acos(-1.0);
    24 const int d1x[]= {0,-1,0,1};
    25 const int d1y[]= {-1,0,1,0};
    26 const int d2x[]= {0,-1,0,1};
    27 const int d2y[]= {1,0,-1,0};
    28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
    29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
    30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
    31 /***************************************/
    32 void openfile()
    33 {
    34     freopen("data.in","rb",stdin);
    35     freopen("data.out","wb",stdout);
    36 }
    37 priority_queue<int> qi1;
    38 priority_queue<int, vector<int>, greater<int> >qi2;
    39 /**********************华丽丽的分割线,以上为模板部分*****************/
    40 int main()
    41 {
    42     int n;
    43     while(scanf("%d",&n)!=EOF)
    44     {
    45         int i;
    46         int ce;
    47         for(i=0;i<n;i++)
    48         {
    49             scanf("%d",&ce);
    50             qi2.push(ce);
    51         }
    52         long long sum=0;
    53         while(qi2.size()>1)
    54         {
    55             int u=qi2.top();
    56             qi2.pop();
    57             int v=qi2.top();
    58             qi2.pop();
    59             sum+=(u+v);
    60             qi2.push(u+v);
    61         }
    62         printf("%lld
    ",sum);
    63         while(!qi2.empty())
    64             qi2.pop();
    65     }
    66     return 0;
    67 }
    View Code
    屌丝终有逆袭日,*******。
  • 相关阅读:
    【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
    【BZOJ4556】[Tjoi2016&Heoi2016]字符串 后缀数组+二分+主席树+RMQ
    【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
    STM32L476应用开发之七:流量的PID控制
    STM32L476应用开发之六:电池SOC检测
    信息摘要算法之一:MD5算法解析及实现
    我的家乡
    STM32L476应用开发之五:数据保存与SD卡操作
    STM32L476应用开发之四:触摸屏驱动与数据交互
    STM32L476应用开发之三:串行通讯实验
  • 原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3868325.html
Copyright © 2011-2022 走看看