nyoj 55 懒省事的小明 优先队列 multiset 还有暴力
懒省事的小明
- 描述
-        小明很想吃果子,正好果园果子熟了。在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。小明决定把所有的果子合成一堆。 因为小明比较懒,为了省力气,小明开始想点子了: 
 每一次合并,小明可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。小明在合并果子时总共消耗的体力等于每次合并所耗体力之和。
 
 因为还要花大力气把这些果子搬回家,所以小明在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。
 
 例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以小明总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。- 输入
- 第一行输入整数N(0<N<=10)表示测试数据组数。接下来每组测试数据输入包括两行,第一行是一个整数n(1<=n<=12000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。
- 输出
- 每组测试数据输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
- 样例输入
- 
1 
 3
 1 2 9
- 样例输出
- 
15 
- 来源
- [hzyqazasdf]原创
- 上传者
 标准的哈夫曼树,一直没搞懂是怎么算的,原来是这样:终于搞懂是怎么算的了。比如说4个数3 4 5 9.结果为40.怎么算呢。就是先取出最小的两个3 4.求和ans=3+4=7;然后把7放进所有的里面编程7 5 9.取出最小的两个 5 7。ans+=7+5+7=19;把这两个数的和12放进去变成12 9.然后把剩下两个取出来12 9.ans+=19+12+9=40. 这就是哈夫曼树、 这里直接用优先队列实现。 优先队列代码: #include <stdio.h> 
 #include <algorithm>
 #include <string.h>
 #include <iostream>
 #include <queue> using namespace std; struct mycomp
 {
 bool operator()(const int &a,const int &b)
 {
 return a>b;
 }
 }; int main()
 {
 priority_queue<long long,vector<long long>,mycomp> pp;
 int T,n,x;
 scanf("%d",&T);
 while(T--)
 {
 long long ans=0;
 scanf("%d",&n);
 for(int i=0; i<n; i++)
 {
 scanf("%d",&x);
 pp.push(x);
 }
 if(n==1)
 {
 printf("%d\n",x);
 }
 else
 {
 while(pp.size()>1)
 {
 int a=pp.top();
 pp.pop();
 int b=pp.top();
 pp.pop();
 int x=a+b;
 ans+=x;
 //printf("%d %d\n",a,b);
 pp.push(x);
 } printf("%lld\n",ans);
 }
 while(!pp.empty())
 pp.pop();
 }
 return 0;
 }multiset多重集合容器实现 #include <stdio.h> 
 #include <algorithm>
 #include <string.h>
 #include <iostream>
 #include <queue>
 #include <set> using namespace std; int main()
 { int T,n,x;
 scanf("%d",&T);
 while(T--)
 {
 multiset<long long> v;
 long long ans=0;
 scanf("%d",&n);
 for(int i=0; i<n; i++)
 {
 scanf("%d",&x);
 v.insert(x);
 }
 if(n==1)
 printf("%d\n",x);
 else
 {
 while(v.size()>1)
 {
 multiset<long long>::iterator it=v.begin();
 int a=*(it);
 int b=*(++it);
 v.erase(v.begin());
 v.erase(v.begin());
 ans+=(a+b);
 v.insert(a+b);
 }
 printf("%lld\n",ans);
 }
 }
 return 0;
 }- 牛人暴力代码:时间24
 #include<stdio.h> 
 #include<string.h>
 int a[13000];
 int b[13000];
 int fronta,frontb,reara,rearb;
 void qqqsort(int low,int high,int a[])
 {
 int i,j,x;
 if(low>high)
 return;
 i=low;
 j=high;
 x=a[i];
 while(i!=j)
 {
 while(i<j&&a[j]>x)
 j--;
 if(i<j)
 {
 a[i]=a[j];
 i++;
 }
 while(i<j&&a[i]<x)
 i++;
 if(i<j)
 {
 a[j]=a[i];
 j--;
 }
 }
 a[i]=x;
 qqqsort(low,j-1,a);
 qqqsort(i+1,high,a);
 }
 int get()
 {
 if(fronta==reara)
 return b[frontb++];
 if(frontb==rearb)
 return a[fronta++];
 return a[fronta]<b[frontb]?a[fronta++]:b[frontb++];
 }
 int main()
 {
 long long ans,t;
 int n,m,i;
 scanf("%d",&n);
 while(n--)
 {
 scanf("%d",&m);
 memset(a,0,sizeof(a));
 memset(b,0,sizeof(b));
 for(i=0; i<m; i++)
 scanf("%d",&a[i]);
 qqqsort(0,m-1,a);
 fronta=frontb=rearb=ans=0;
 reara=m;
 for(i=0; i<m-1; i++)
 {
 t=get()+get();
 ans+=t;
 b[rearb++]=t;
 }
 printf("%lld\n",ans);
 }
 return 0;
 }
nyoj 55 懒省事的小明 优先队列 multiset 还有暴力的更多相关文章
- nyoj 55 懒省事的小明(priority_queue优先队列)
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ... 
- nyoj 55 懒省事的小明【优先队列】
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ... 
- NYOJ 55 懒省事的小明(哈弗曼树)
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 小明非常想吃果子,正好果园果子熟了. 在果园里,小明已经将全部的果子打了下来,并且按果子的不 ... 
- 懒省事的小明--nyoj55
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成 ... 
- ny55 懒省事的小明
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而 ... 
- ACM 懒省事的小明
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ... 
- 【ACM】懒省事的小明
		懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ... 
- ACM题目————STL练习之 懒省事的小明(优先队列)
		描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.小明决定把所有的果子合成一堆. 因为小明比较懒,为了省力气,小明开始想点子了: 每一 ... 
- NYOJ 55-懒省事的小明
		点击打开链接 懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果 ... 
随机推荐
- CentOS的MySQL报错:Can't connect to MySQL server
			原文链接: http://www.centoscn.com/CentosBug/softbug/2015/0622/5709.html 问题描述: 使用客户端远程登录连接基于CentOS 6.5服务器 ... 
- JS 切换显示
			<style> #hhh div { width:200px; height:200px; background:red; display:none; ... 
- Python函数式编程:内置filter函数使用说明
			filter操作是函数式编程中对集合的重要操作之一,其作用是从原集合中筛选符合条件的条目,组成一个新的集合. 这在我们日常编程中是非常常见的操作.我们通常的做法是通过循环语句来处理. 而使用filte ... 
- JAVA平台上的网络爬虫脚本语言 CrawlScript
			JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ... 
- LVS--什么是LVS?
			1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ... 
- 我的Python成长之路---第一天---Python基础(6)---2015年12月26日(雾霾)
			七.列表——list Python的列表是一种内置的数据类型,是由Python的基本数据类型组成的有序的集合.有点类似C语言的数组,但与数组不同的是,Python在定义列表的时候不用指定列表的容积(长 ... 
- 一天一个类,一点也不累 之 Set接口
			我们的口号是:一天一个类,一点也不累-- 再次回忆一下集合相关的类图. 官方API上这样介绍这个接口: A collection that contains no duplicate elements ... 
- IOS_Note
			关键字:可以搜索这些关键字找到具体内容 退回输入键盘.CGRect.CGPoint & CGSize.设置透明度.设置背景色.自定义颜色. 竖屏.横屏.状态栏高 (显示时间和网络状态). 导 ... 
- splinter python浏览器自动化操作,模拟浏览器的行为
			Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ... 
- 统一横轴墨卡托投影(UTM)
			UTM 坐标系统使用基于网格的方法表示坐标.UTM 系统将地球分为 60 个区,每一个区基于横轴墨卡托投影.画图法中的地图投影方法能够在平面中表示一个两维的曲面,比如一个标准地图.图 1 展示了一个横 ... 
