合并果子2之蚂蚁搬沙 【贪心】
时间:2019-11-06
本文章向大家介绍合并果子2之蚂蚁搬沙 【贪心】,主要包括合并果子2之蚂蚁搬沙 【贪心】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
1552: 合并果子2之蚂蚁搬沙
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 353 Solved: 158
[Submit][Status][Web Board]
Description
山谷中住着一个巨大的蚂蚁王国,蚁穴外有一个整洁的广场,天气晴好时蚁群常在那里举行各种活动。这天夜里,天降果子尘,第2天,广场上堆满了大大小小的果子堆,蚁哨出去数了数共有n堆,蚁后要求她的臣民将广场上的果子堆清理掉。具体办法是:每次可以把广场上的任意k堆果子合并成一堆,重复进行直至所有的果子堆最终合并成一堆。规定(1):2≤k≤m,m由蚁后指定,(2):每次合并k堆果子的代价是这k堆果子子的重量和。
你的任务是,对给定的n和m,计算出将n堆果子最终合并成1堆的最小总代价。
例如,广场上有7堆果子,其重量分别为45,13,12,16,9,5,22。当m=3时,这些果子堆合并成一堆的最小总代价为199。当m=5时,这些果子堆合并成一堆的最小总代价为148。
你的任务是,对给定的n和m,计算出将n堆果子最终合并成1堆的最小总代价。
例如,广场上有7堆果子,其重量分别为45,13,12,16,9,5,22。当m=3时,这些果子堆合并成一堆的最小总代价为199。当m=5时,这些果子堆合并成一堆的最小总代价为148。
Input
包含n+2个整数(n≤100000),其中第一行2个正整数,分别表示n堆果子和每次合并时可以合并的最大堆数m,从第二行开始有n个数,表示n堆果子的重量(1~500),数与数之间用空格隔开。
Output
只包含一个正整数,表示将n堆果子合并成1堆所需的最小总代价。
Sample Input
7 3
45 13 12 16 9 5 22
Sample Output
199
HINT
Source
合并果子类的题目都可以看成是一个完全k叉树。
为什么呢?
先拿样例来说
这样就可以刚好合并完所有的节点
那如果无法刚好合并完,怎么办?
这时我们可以多加入几个节点,使其变成完全k叉树,注意:这里加入的几个点权值必须为0。
这样就解决了无法合并的问题。
那如何算出到底要多加几个节点呢?
计算方式:
因为每次可以合并m堆,所以可以合并成(n/m)堆完整的,并且还剩下(n%m)堆,
n堆就等同于(n/m)+(n%m)堆,
一直进行此运算,直到(n<=m)时,n距离完整的m堆还差(m-n)堆,
即(m-n) 就是添0的个数。
最后我们就可以用一个小根堆来维护,不断的加入最小值,其解最后一定最优。
code:
1 #include<bits/stdc++.h> 2 #pragma GCC optimize(3) 3 4 using namespace std; 5 int n,k,nn,add,ans; 6 priority_queue<int,vector<int>,greater<int> >q;//小根堆 7 void inint(){ 8 freopen("sand.in","r",stdin); 9 freopen("sand.out","w",stdout); 10 } 11 inline int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 14 while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 15 return x*f; 16 } 17 inline void write(int x) 18 { 19 if(x<0)x=-x,putchar('-'); 20 if(x>9)write(x/10); 21 putchar(x%10+'0'); 22 } 23 int main() 24 { 25 //inint(); 26 n=read(),k=read(); 27 for(int i=1,y;i<=n;i++){ 28 y=read(); 29 q.push(y); 30 } 31 nn=n; 32 while(1){ 33 int c=nn/k; 34 int mod=nn%k; 35 nn=c+mod; 36 if(nn<=k){ 37 add=k-nn;//加入add个0 38 break; 39 } 40 } 41 for(int i=1;i<=add;i++){ 42 q.push(0); 43 } 44 while(!q.empty()){ 45 int x=0; 46 for(int i=1;i<=k;i++){ 47 x+=q.top(); 48 q.pop(); 49 } 50 ans+=x; 51 if(q.empty()){ 52 printf("%d\n",ans);//注意:一定要这样写,如果把ans最后统计的话,会导致死循环 53 return 0; 54 } 55 q.push(x); 56 } 57 return 0; 58 }
原文地址:https://www.cnblogs.com/nlyzl/p/11804191.html
- 如何把业务问题变成机器学习的问题?
- 这算是ASP.NET MVC的一个大BUG吗?
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN
- 区块链技术在非能源领域的应用场景
- Python读书笔记8
- How to debug .NET Core RC2 app with Visual Studio Code on Windows?
- 难道.NET Core到R2连中文编码都不支持吗?
- .NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序
- matplotlib的基本用法(四)——设置legend图例
- TensorFlow深度学习笔记 文本与序列的深度模型
- 究竟哪里安全?加拿大VS中国治安大数据起底!意料之中还是之外?
- muduo网络库学习之EventLoop(四):EventLoopThread 类、EventLoopThreadPool 类
- 从小程序游戏开放可以看出,微信已经开始转移小程序战场了
- 17年AI在游戏中完胜人类,AlphaGo的下一个目标是什么?DeepMind有一个45年超越人类计划
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义控件实现饼状图
- Android自定义控件ListView下拉刷新的代码
- Numpy 理解ndarray对象的示例代码
- Django import export实现数据库导入导出方式
- Android读取XML文件中的数据
- 初识JavaScript
- Android自定义ImageView实现圆角功能
- JavaScript 运算符
- JavaScript 流程控制-分支
- Android UI开发中所遇到的各种坑
- 在Android系统源码中预置APK的方法
- JavaScript 流程控制-循环
- JavaScript数组
- JavaScript 对象
- JavaScript 简单数据类型和复杂数据类型