蚂蚁搬沙(2017佛山市选拔初中组)

题目描述

山谷中住着一个巨大的蚂蚁王国,蚁穴外有一个整洁的广场,天气晴好时蚁群常在那里举行各种活动。这天夜里,天降沙尘,第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。

输入格式 1757.in

第一行2个正整数,分别表示n(n≤100000)堆沙子和每次合并时可以合并的最大堆数m,从第二行开始有n个数,表示n堆沙子的重量(1~500),数与数之间用空格隔开。

输出格式 1757.out

只包含一个正整数,表示将n堆沙子合并成1堆所需的最小总代价。

输入样例 1757.in

7 3 
45 13 12 16 9 5 22

输出样例 1757.out

199

  一开始做这题的时候,我连样例都看了半天。首先,由5+9+12=26,再由13+16+22=51,最后26+45+51=122,最终答案为26+51+122=199。

  所以我们会发现,在前面加的,会被重复累加更多次,所以每一次优先堆的最好越小越好,而且越多。

这题用到优先队列,我写代码的时候犯了一个小小的错误,把普通队列的定义误以为是优先队列priority_queue<int> s;(一开始定义了queue<int> s),对优先队列的使用还不太熟悉。

如果当(n-1)%(m-1)没有余数时,则从小的取起,每一堆都放m个,这样求出来的就是最大值。

但是如果有多余的呢?如果前面一堆都有m个,那最后的累加部分就会变多,不是最优的。所以,我们要让重的尽量添加少的次数。算出n%(m-1),把多余的部分垒成一堆,把特殊的情况变回原来熟悉的(n-1)%(m-1)== 0,这样子又可以重复回上面的操作了。

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,a,ans;
priority_queue<int> s;
int main()
{freopen("1757.in","r",stdin);freopen("1757.out","w",stdout);cin>>n>>m;for(int i=1;i<=n;i++) {cin>>a;s.push(-a);}if((n-1)%(m-1)==0){int k=(n-1)/(m-1);while(k){int now=0;for(int i=1;i<=m;i++){now=now+s.top();s.pop();}ans+=now;s.push(now);k--;}}else{int k=n%(m-1),now=0;for(int i=1;i<=k;i++){now=now+s.top();s.pop();}ans+=now;s.push(now);int v=(n-k)/(m-1);while(v){int now=0;for(int i=1;i<=m;i++){now=now+s.top();s.pop();}ans+=now;s.push(now);v--;}}cout<<-ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/yiyiyizqy/p/7397076.html

蚂蚁搬沙(2017佛山市选拔初中组)相关推荐

  1. 发射站(2017佛山市选拔初中组)

    发射站(2017佛山市选拔初中组) 题目描述 有N个能量发射站排成一行,每个发射站i都有不相同的高度 Hi,并能向两边(当然两端的只能向一边)同时发射能量值为Vi的能量,并且发出的能量只被两边最近的且 ...

  2. 金环(2017佛山市选拔初中组)

    金环(2017佛山市选拔初中组) 题目描述 小月亮到达了一个城市并住在一个宾馆.她没有钱了,但是过了N天,她就会收到一大笔钱.但是她有一条由N个金环串成的金链.小月亮必须每天付1个金环给商家,但是她可 ...

  3. 合并果子2之蚂蚁搬沙

    合并果子2之蚂蚁搬沙 Description 山谷中住着一个巨大的蚂蚁王国,蚁穴外有一个整洁的广场,天气晴好时蚁群常在那里举行各种活动.这天夜里,天降果子尘,第2天,广场上堆满了大大小小的果子堆,蚁哨 ...

  4. c语言蚂蚁搬,《蚂蚁搬豆》教案

    第1篇:<蚂蚁搬豆>教案 一.活动目的 1.学习歌曲<蚂蚁搬豆> 2.愿和老师.同伴一起愉快地参加音乐活动. 3.感受本歌曲的欢快气氛,初步学着用动作来表示歌曲中的意思. 二. ...

  5. c语言蚂蚁搬,关于蚂蚁搬食的作文

    第1篇:关于蚂蚁搬食的作文 一天下午,我和好朋友一起在楼下玩耍,.突然我们看到了一大奇观--蚂蚁搬食. 一只小蚂蚁正找到了一块大饼干屑,只见它一会儿使出浑身的力气冲向那一块饼干屑,一会儿又绕着饼干屑转 ...

  6. c语言蚂蚁搬,小班语言蚂蚁搬豆教案

    活动目标: 1.通过情境化的游戏,理解儿歌的`内容,提高学习儿歌的兴趣. 2.初步懂得人多力量大的道理. 3.感受游戏的乐趣. 活动准备: 1.蚂蚁头饰各幼儿一只(分红.蓝两色). 2.蚂蚁洞穴一个, ...

  7. c语言蚂蚁搬,小蚂蚁搬豆阅读答案

    小蚂蚁搬豆 小蚂蚁找到了一粒豆子,它急急忙忙往家里赶,只见小蚂蚁用它头上的触角碰一碰在它旁边的小蚂蚁,这只小蚂蚁也用触角点了点,表示知道了.它又用触角碰碰后面的蚂蚁.这样,一只碰一只,大伙儿都知道了. ...

  8. BDTC 2017数据库:犹他大学、东方国信、蚂蚁金服、微软、人大金仓畅谈数据库发展与实践...

    [CSDN现场报道]12月7-9日,由中国计算机学会主办,CCF 大数据专家委员会承办,中国科学院计算技术研究所.中科天玑数据科技股份有限公司.CSDN协办的2017中国大数据技术大会(BDTC 20 ...

  9. 冷战2017,腾讯金融VS蚂蚁金服过去的一年

    作者丨董云峰 来源丨新金融琅琊榜(ID:finrank) 如果对比腾讯和阿里巴巴的金融业务,2017是很有趣的一年.本文试着做一些梳理和分析. 在新金融琅琊榜看来,近年来腾讯不断扩大金融布局,作为后发 ...

最新文章

  1. 信噪比与错误指数matlab,关于信噪比不符合理论值的问题
  2. android手机浏览器研究报告,QQ浏览器Android客户端产品体验报告
  3. MangoTrainingCourse课程hands-on lab-1
  4. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)
  5. Codeforces 466E Information Graph
  6. 『题解』Codeforces446C DZY Loves Fibonacci Numbers
  7. 爬虫爬取数据时如何快速换IP?极光IP轻松搞定
  8. PowerPoint 消除所有动画VBA指令
  9. 邮箱容量多大?163邮箱发邮件无限容量解读
  10. DeFi 的纵向扩张:利率协议将带来去中心化金融世界新变革
  11. Vue+高德地图API的使用(点击地图搜索周边信息)
  12. 阿里巴巴原来这么容易就能进去…
  13. 思维导图分享以及MindManager使用说明
  14. speedoffice(word)如何修改行间距
  15. coursera无法播放视频
  16. 原画 机器人总动员_《机器人瓦力》导演执导 科幻史诗巨制《火星上的约翰·卡特》首支震撼预告...
  17. 三极管基极下拉电阻作用
  18. ArcGis显示点,线,和多边形
  19. flv封装H264+AAC[附完整代码]
  20. 用友T6各模块数据传递关系培训资料

热门文章

  1. android.view.inflateexception binary xml file line 异常的解决方法
  2. 机智云明星开发者 | 00后开发者和他的大大创客梦想
  3. 南京邮电大学电工电子(数电)实验报告——组合逻辑电路 时序逻辑电路
  4. 春节特献!一文纵览2022年全球量子计算行业要闻!
  5. 幼儿园科学教案计算机,幼儿园大班科学教案5篇
  6. 地方行业网站建设的三个建议
  7. 电脑键盘中F1-F12被称为功能键其各自功能如下
  8. mongodb启动不了:child process failed, exited with error number 100
  9. 《武林外传》之(二) 佟掌柜的三板斧
  10. 基于Python的图像分类 项目实践——图像分类项目