Fence Repair
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 51411   Accepted: 16879

Description

Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a single long board just long enough to saw into the N planks (i.e., whose length is the sum of the lengths Li). FJ is ignoring the "kerf", the extra length lost to sawdust when a sawcut is made; you should ignore it, too.

FJ sadly realizes that he doesn't own a saw with which to cut the wood, so he mosies over to Farmer Don's Farm with this long board and politely asks if he may borrow a saw.

Farmer Don, a closet capitalist, doesn't lend FJ a saw but instead offers to charge Farmer John for each of the N-1 cuts in the plank. The charge to cut a piece of wood is exactly equal to its length. Cutting a plank of length 21 costs 21 cents.

Farmer Don then lets Farmer John decide the order and locations to cut the plank. Help Farmer John determine the minimum amount of money he can spend to create the N planks. FJ knows that he can cut the board in various different orders which will result in different charges since the resulting intermediate planks are of different lengths.

Input

Line 1: One integer N, the number of planks 
Lines 2..N+1: Each line contains a single integer describing the length of a needed plank

Output

Line 1: One integer: the minimum amount of money he must spend to make N-1 cuts

Sample Input

3
8
5
8

Sample Output

34

Hint

He wants to cut a board of length 21 into pieces of lengths 8, 5, and 8. 
The original board measures 8+5+8=21. The first cut will cost 21, and should be used to cut the board into pieces measuring 13 and 8. The second cut will cost 13, and should be used to cut the 13 into 8 and 5. This would cost 21+13=34. If the 21 was cut into 16 and 5 instead, the second cut would cost 16 for a total of 37 (which is more than 34).

题意:.将一条木板切成n条小木块,每一块长度为len的木板需要len的费用,求切完所有木板的费用之和的最小值

解题思路:本题的解法类似于哈夫曼编码,一直选用两块最小的相加,得到费用之和,本题用到了优先队列,本题要注意两点1.单独判断木板只有一个的情况,2.输出时费用之和要用long long类型的,否则会wrong answer

本题代码:

 #include<queue>
#include<vector>
#include<stdio.h>
#include<iostream>
using namespace std;
int n;
long long sum;
int main(){
while(~scanf("%d",&n)){
sum=;
priority_queue<int,vector<int>,greater<int> >q;
for(int i=;i<n;i++){
int a;
scanf("%d",&a);
q.push(a);
}
if(q.size()==){
sum=q.top();
q.pop();
}
while(q.size()>){
int m,t;
m=q.top();
sum+=m;
q.pop();
t=q.top();
sum+=t;
q.pop();
q.push(m+t);
}
printf("%lld\n",sum);
}
return ;
}

笔记:优先队列

三种用法
第一种,直接使用默认的:
它的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式.
Container 必须是用数组实现的容器,比如 vector, deque(双向队列) 但不能用 list(链表).
STL里面默认用的是 vector. 比较方式默认用 operator< .
所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大.

priority_queue<int>Q;
Q.push();
Q.push();
Q.push();
Q.push();
cout<<Q.size()<<"\n";
while(!Q.empty())
{
  cout<<Q.top()<<" ";
  Q.pop();
}

输出:
4
4 3 2 1

第二种方法:(从小到大输出)
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
priority_queue<int, vector<int>, greater<int> >Q

priority_queue<int, vector<int>, greater<int> >Q;
Q.push();
Q.push();
Q.push();
Q.push();
cout<<Q.size()<<"\n";
while(!Q.empty())
{
  cout<<Q.top()<<" ";
    Q.pop();
}

输出:
4
1 2 3 4

第三种,自定义类型:
重载 operator < 或者自己写仿函数

struct Node
{
  int x;
  int y;
  Node() {};
  Node(int a,int b)
  {
  x=a;
  y=b;
  }
}; bool operator < (Node a,Node b)
{
  if(a.x==b.x)
  return a.y>b.y;
  return a.x>b.x;
} int main()
{
  priority_queue<Node>q;
  q.push(Node(,));
  q.push(Node(,));
  q.push(Node(,));
  q.push(Node(,));
  q.push(Node(,));
  while(!q.empty())
  {
    Node node=q.top();
    q.pop();
    cout<<node.x<<" "<<node.y<<"\n";
  }
  return ;
}

输出:

1 1
1 2
2 7
3 4
5 6

也可以这么写

struct Node
{
  int x;
  int y;
  Node() {};
  Node(int a,int b)
  {
    x=a;
    y=b;
  }
  const bool operator < (Node b)const
  {
    if(x==b.x)
    return y>b.y;
    return x>b.x;
  }
};

还有重载()运算符

struct Node
{
  int x;
  int y;
  Node() {};
  Node(int a,int b)
  {
    x=a;
    y=b;
  }
};
struct cmp
{
  bool operator () (Node a,Node b)
  {
  if(a.x==b.x)
  return a.y>b.y;
  return a.x>b.x;
  }
};

优先队列 poj3253 Fence Repair的更多相关文章

  1. Poj3253 Fence Repair (优先队列)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 67319   Accepted: 22142 De ...

  2. poj3253 Fence Repair【哈夫曼树+优先队列】

    Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...

  3. poj-3253 fence repair(贪心题)

    题目描述: Farmer John wants to repair a small length of the fence around the pasture. He measures the fe ...

  4. poj3253 Fence Repair

    http://poj.org/problem?id=3253 Farmer John wants to repair a small length of the fence around the pa ...

  5. POJ3253 Fence Repair(贪心)

    分割木板的顺序是自由的,所以每次选择两块最短的板,组合在一起,增加队列,原来两个板出队,直到队列中为空或者仅仅剩下一个板时结束.这里使用优先队列较为方便. #include<iostream&g ...

  6. poj3253 Fence Repair(贪心+哈夫曼 经典)

    https://vjudge.net/problem/POJ-3253 很经典的题,运用哈夫曼思想,想想很有道理!! 具体实现还是有点绕人,最后被long long卡了一下,看数据大小的时候单纯相乘了 ...

  7. POJ3253 Fence Repair【贪心】

    我们的小伙伴Bingo真的很调皮,他在上课的路上看到树上有个鸟窝,他就想去把他捅下来,但是鸟窝很高他够不到,于是他就到处找木棍,想把这些木棍接在一起,然后去捅鸟窝.他一共找了N跟木棍 (1 ≤ N ≤ ...

  8. [POJ3253]Fence Repair(单调队列)

    题目链接 http://poj.org/problem?id=3253 题目描述 大意:切长度为a的木条的花费是a,给定最终切好的n段各自的长度,问由原来的一根木条(长度为n段长度和)以最终总花费最小 ...

  9. POJ 3253 Fence Repair (优先队列)

    POJ 3253 Fence Repair (优先队列) Farmer John wants to repair a small length of the fence around the past ...

随机推荐

  1. 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4298  Solved: 1944[Submit][Sta ...

  2. 网络基础二 tcp/ip协议簇 端口 三次握手 四次挥手 11种状态集

    第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成 ...

  3. 状态码为 200 from cache和304 Not modified的区别

    1.请求状态码为 200  from cache: 表示该资源已经被缓存过,并且在有效期内,所以不再向浏览器发出请求,直接使用本地缓存. 如下图: 2.状态码为 304 Not modified: 表 ...

  4. postgis几何操作函数集

    管理操作函数 AddGeometryColumn - Adds a geometry column to an existing table of attributes. By default use ...

  5. C#多功能DataGridView打印类(WinForm)

    ;                printPreviewDialog.ShowDialog();            }            catch            {         ...

  6. SpringBoot之简单日志配置

    我的目的指定一个文件夹输出:(不采用指定文件的原因是一个文件的大小时间长了会很大,不利于处理) logging: level: root: INFO org.sselab: controller: I ...

  7. 【Java】java 中的泛型通配符——从“偷偷地”地改变集合元素说起

    一直没注意这方面的内容,想来这也算是基础了,就写了这个笔记. 首先java的通配符共有三种----先别紧张,现在只是粗略的过一下,看不看其实无所谓 类型 介绍 <?> 无限定通配符,等价于 ...

  8. params SqlParameter[] commandParameters(转)

    C#代码  ExecuteReader(string connectionString, CommandType commandType, string commandText, params Sql ...

  9. 例题:填词-poj

    问题描述 Alex喜欢填词游戏.填词游戏是一个非常简单的游戏.填词游戏包括一个N X M大小的矩形方格盘和P个单词.玩家需要把每个方格中填上一个字母使得每个单词都能在方格盘上被找到.每个单词都能被找到 ...

  10. apache mysql无法启动解决办法

    最近在调试几个代码,需要不停的启动关闭服务器和mysql.在连续的几次开关后,无法启动了,每次启动后就直接关闭. 刚开始是怀疑是不是端口被占用了,查看端口后,并没有端口被占用的情况.查看mysql错误 ...