[luoguP1090][Noip2004]合并果子
合并果子
首先来看一下题目:
(OI2004合并果子)
【题目描述】
果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和.
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
【输入格式】
第一行:一个数n,表示果子的堆数。
第二行:n个数ai,表示每堆果子的果子个数。
【输出格式】
一个数:多多所要花费的最小的体力。
【数据范围】:
n≤100000
【输入样例1】
3
1 2 9
【输出样例1】
15
【输入样例2】
10
3 5 1 7 6 4 2 5 4 1
【输出样例2】
120
这个题就用到了堆的思想。按照一般的思想来打代码,应该是每一次合并之后就从大到小拍一遍序,接着合并。按照这样的思路,答案是没有错的,但是时间复杂度就会十分的高。下面附一下普通思路的合并果子的代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 100010
using namespace std;
},total=;
int cmp(int x,int y)
{
return x>y;
}
int main()
{
scanf("%d",&n);
;i<=n;i++)
scanf("%d",&heavy[i]);
sort(heavy+,heavy+n+,cmp);
;i<=n;i++)
{
heavy[i]+=heavy[i-];
heavy[i-]=;
sort(heavy+,heavy+n+,cmp);
energy[i]=heavy[i]+heavy[i-];
}
;i<=n-;i++)
total+=energy[i];
printf("%d",total);
;
}
那么在这里就用到了堆(不懂堆的小朋友:详见->《堆》)
那么思路是这样的:
首先这个问题比较模糊,所以我们可以将它的问题描述转化一下:给了n个节点(即果子堆数),每一个节点有一个权值w[i](每一个堆的果子个数),我们要做的就是将其中的两个合并为一棵树, 假设每一个节点到根节点的距离为d[i],那么我们就要使得最终的∑(w[i]*d[i])最小(不懂∑的请点这里->《希腊字母在数学计算中表示的含义》)。那么具体的方法就是这样的:
- 从这个森林里面取出两个权值最小的节点。
- 将他们的权值相加,得到一个新的子树,然后删除原子树。
- 将当前得到的新子树插入到森林中然后维护。
- 不断重复1~3直到整个森林里面只有一棵树为止。
所以这里最重要的其实就是两个操作:取出get()和插入put()。
但是由于取出只能取出根节点,二我们要取出的还必须是权值最小的节点,所以我们要制作一个小根堆。
下面附上代码:
#include<iostream>
#include<cstdio>
using namespace std;
int heap_size,n;
];
void swip(int &a,int &b)
{
;a=b;b=t;
}
void put(int d)
{
int now,next;
heap[++heap_size]=d;
now=heap_size;
)
{
next=now>>;
if(heap[now]>=heap[next]) return;
swap(heap[now],heap[next]);
now=next;
}
}
int get()
{
int now,next,res;
res=heap[];
heap[]=heap[heap_size--];
now=;
<=heap_size)
{
next=now*;
]<heap[next]) next++;
if(heap[now]<heap[next]) return res;
swap(heap[now],heap[next]);
now=next;
}
return res;
}
void work()
{
;
scanf("%d",&n);
;i<=n;i++)
{
scanf("%d",&x);
put(x);
}
;i<n;i++)
{
x=get();
y=get();
ans+=x+y;
put(x+y);
}
printf("%d",ans);
}
int main()
{
work();
;
}
[luoguP1090][Noip2004]合并果子的更多相关文章
- NC16663 [NOIP2004]合并果子
NC16663 [NOIP2004]合并果子 题目 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可 ...
- NOIP2004合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 合并果子(NOIP2004)
合并果子(NOIP2004)[问题描述]在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体 ...
- [Noip2004][Day ?][T?]合并果子(?.cpp)
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- [NOIP2004] 提高组 洛谷P1090 合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 加强版:合并果子[NOIP2004]
题目 链接:https://ac.nowcoder.com/acm/contest/26887/1001 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- 合并果子 (codevs 1063) 题解
[问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和 ...
- 代码源 每日一题 分割 洛谷 P6033合并果子
题目链接:切割 - 题目 - Daimayuan Online Judge 数据加强版链接: [NOIP2004 提高组] 合并果子 加强版 - 洛谷 题目描述 有一个长度为 ∑ai 的木板,需要 ...
- 【noip 2004】 合并果子
noip2016结束后的第一份代码--优先队列的练习 合并果子 原题在这里 #include <iostream> #include <queue> #include < ...
随机推荐
- nginx location 配置阐述优先级别使用说明
使用nginx 有大半年了,它的高性能,稳定性表现很好. 这里也得到很多人的认可. 其中它的配置,有点像写程序一样,每行命令结尾一个";"号,语句块用"{}"括 ...
- JavaScript中有var和没var的区别
Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (function(){ // ... })(); 在函数内部,有var和没var声明的变量是不一样的.有var声明的 ...
- Hibernate 缓存机制详细解析
一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...
- 18 Command Line Tools to Monitor Linux Performance
By Ravi Saive Under: Linux Commands, Monitoring Tools On: December 26, 2013 http://www.tecmint.com/c ...
- java 获取网络地址图片
收藏一个获取网络图片的方法. //获取网络图片 public void ImageRequest(String ImageName,String GifUrl) throws Exception { ...
- struts2 :Unable to load configuration. ……struts-default.xml:46:178异常解决
这个问题是缺少jar包 除了ognl-2.6.11.jar,struts2-core-2.1.6.jar,xwork-2.1.2.jar,commons-logging-1.0.4.jar外, 还需要 ...
- jQuery:mouseover and Increase the Size of an Image
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Intellij idea配置scala开发环境
1.Intellij idea配置scala开发环境 解决Plugin Scala was not installed: No route to host Plugin Scala was not i ...
- File GDB API
bbs一问一答 https://blogs.esri.com/esri/arcgis/2010/12/13/file-geodatabase-api-details/ 下载页面 http://www. ...
- Android 第三方类库简单使用之EventBus
Android 第三方类库之EventBus 1 PS 工欲善其事必先利其器. Eventbus也是一款在开发中常用的利器 这篇也对EventBus的简单介绍和使用,与之前个xutils介绍的级别一样 ...