NC16663 [NOIP2004]合并果子
NC16663 [NOIP2004]合并果子
题目
题目描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入描述
输入包括两行,第一行是一个整数 \(n(1\leq n\leq 10000)\) ,表示果子的种类数。第二行包含 \(n\) 个整数,用空格分隔,第 \(i\) 个整数 \(a_i(1 \leq a_i \leq 20000)\)是第 \(i\) 种果子的数目。
输出描述
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于\(2^{31}\)。
示例1
输入
3
1 2 9
输出
15
备注
对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。
题解
思路
知识点:队列,贪心。
此题用优先队列能很容易解答,复杂度是 \(O(n\log n)\) 。这里用队列实现,利用了合并方式固定的条件,实现了一组单调的队列,而不需要用 \(\log n\) 花费排序,循环的复杂度是 \(O(n)\),包括开始排序的总复杂度是 \(O(n \log n)\) ,但常数比优先队列小很多。
显然,因为合并次数是固定的,先合并的果堆重复计算次数就多,所以选最小的两堆合并,因此先从小到大排序,全部入队后开始合并。
注意到,从小到大选取合并出的新果堆必然是递增的,因此可以考虑用一个新队列存放新的果堆,然后每次在两个队头的选两次最小值。因为最小的两个果堆,无论从哪个取的,都一定比之前两个大,所以所有新果堆都可以放在新队列队尾,而不破坏新队列里的递增性。
最后循环 \(n\) 次并累加即可。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
int a[10007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 0;i < n;i++) cin >> a[i];
sort(a, a + n);
queue<int> q1, q2;
for (int i = 0;i < n;i++) q1.push(a[i]);
int ans = 0;
for (int i = 0;i < n;i++) {
int sum = 0;
for (int j = 1;j <= 2;j++) {
if (q2.empty() || !q1.empty() && q1.front() < q2.front()) {
sum += q1.front();
q1.pop();
}
else {
sum += q2.front();
q2.pop();
}
}
ans += sum;
q2.push(sum);
}
cout << ans << '\n';
return 0;
}
NC16663 [NOIP2004]合并果子的更多相关文章
- NOIP2004合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- [luoguP1090][Noip2004]合并果子
合并果子 首先来看一下题目: (OI2004合并果子) [题目描述] 果园里,多多已经将所有的果子打了下来,而且按果子的 ...
- 合并果子(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 < ...
随机推荐
- ES 文档与索引介绍
在之前的文章中,介绍了 ES 整体的架构和内容,这篇主要针对 ES 最小的存储单位 - 文档以及由文档组成的索引进行详细介绍. 会涉及到如下的内容: 文档的 CURD 操作. Dynamic Mapp ...
- 新华三Gen10服务器进SSA查看、配置阵列
1.开机自检进F10 2.F10后选择[smart storage administrator](跳到第5步)或选择第一项IP[intelligent provisioning] 3.选择执行维护 4 ...
- dfs深搜
一.01背包dfs //回溯法,01背包 #include<iostream> #include<algorithm> using namespace std; const i ...
- pyhon对excel的xls与xlsx的读取,写入
import shutilimport osfrom openpyxl import load_workbookfrom xlutils.copy import copyimport win32com ...
- jenkins插件Role-based添加账号后显示红色"No type prefix"
jenkins插件Role-based添加账号save后,前面显示红色"No type prefix",不影响使用. 查了下原因,网上很少正解,我这里记录下正确的方法: 添加用户: ...
- Android 解析包时出现问题 的解决方案(应用检查更新)
问题描述我们在进行Android开发的时候,一般都会在应用里检测有没有更新,并且从网上下载最新的版本包,覆盖本地的旧版本.在我的项目中,出现了一个问题,就是当安装包下载到本地的时候,产生了" ...
- H5如何实现唤起APP
前言 写过hybrid的同学,想必都会遇到这样的需求,如果用户安装了自己的APP,就打开APP或跳转到APP内某个页面,如果没安装则引导用户到对应页面或应用商店下载.这里就涉及到了H5与Native之 ...
- C++面向对象-类和对象那些你不知道的细节原理
一.类和对象.this指针 OOP语言的四大特征是什么? 抽象 封装.隐藏 继承 多态 类体内实现的方法会自动处理为inline函数. 类对象的内存大小之和成员变量有关 类在内存上需要对齐,是为了减轻 ...
- 玩转ASP.NET 6.0框架-序言
ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能. 本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架.本专栏提供 ...
- 贝塞尔曲线在Unity中的应用
前言:国庆放假后基本整个人的散掉了.加之种种原因,没时间没心情写博客.最近研究了一下3d的一些效果.其中有类似翻书撕纸的操作,可是一个panel怎么由平整的变成弯曲的呢? 两点可以确定一条直线,三点可 ...