uva10954 - Add All(multiset函数)

题目:10954 - Add All

题目大意:求n个数的和,但是有点不一样的是题目要求计算最少花费。每次两个数相加,得到的那个数就是每次计算的cost。

解题思路:之前没有想到用multiset,自己写好麻烦。要求cost 最小的话,说明每次都将这些数里面最小的两个做相加,这样每次花费都是最小的。用multiset,就可以将每次计算的结果插入这些已经有序的数据中相应的位置,使得这个序列依旧有序。

代码:

#include <stdio.h>
#include <set>
using namespace std;

int n;
multiset<int> num;

long long solve () {

	long long sum = 0;
	multiset<int>::iterator it1, it2;
	long long temp;
	while (1) {

		if (num.size() == 1)
			break;
		it1 = num.begin();
		it2 = it1++;
		temp = *it1 + *it2;
		sum += temp;
		num.erase(it1);
		num.erase(it2);
		num.insert(temp);
	}
	return sum;
}

int main () {

	int temp;
	while (scanf ("%d", &n), n) {

		num.clear();
		for (int i = 0; i < n; i++) {

			scanf ("%lld", &temp);
			num.insert (temp);
		}

		printf ("%lld\n", solve());
	}
	return 0;
}

uva10954 - Add All(multiset函数),布布扣,bubuko.com

时间: 2024-08-01 06:39:18

uva10954 - Add All(multiset函数)的相关文章

UVA-10954 Add All

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1895 题目大意:类似于这道题UESTC - 1599 就是将所有的数字最后合并为一个数字,但是每次合并需要的消耗值是等于两个数的和,求最小的消耗值. 当然是贪心,每次排序后合并最小的两个值,再题弹出那两个值,压入两值之和.再继续刚才的步骤,直到只要一个了. 用sort肯定是超时的

UVa10954 Add All (Huffman编码,优先队列)

链接:http://vjudge.net/problem/UVA-10954 分析:Huffman编码建立过程,每次贪心选取两个当前最小数,从集合中删去,然后把它们的和放回集合,用优先队列去模拟集合而且可以优化取最小数过程. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 const int maxm = 500 + 5; 7 8 int

Calendar中add函数和roll函数的用法及区别

Calendar中add()和roll()函数的用法一.取某个时间点后的整点时刻.例如1984年7月7日15:23:05后的整点时刻即为1984-07-07 16:00:00.实现如下:Calendar calendar = Calendar.getInstance();calendar.add(Calendar.HOUR_OF_DAY, 1);//小时上加1calendar.set(Calendar.MINUTE, 0);//分钟设为0calendar.set(Calendar.SECOND,

python_为被装饰的函数保留元数据

案例: 在函数对象中保存着一些函数的元数据,如: f.__name__           函数名 f.__doc__              函数文档 f.__moudle__       函数所属模块名 f.__dict__              属性字典 f.__defaults__       默认参数组 -- 在使用装饰器后,在装饰器里访问以上属性时,我们看到的是装饰器函数的元数据 需求: 实现在装饰器函数中,保留 被装饰函数 的元数据 如何实现? 通过 functools中的w

Linux下的select 与函数

Select    循环与菜单 它的主要用于创建菜单,按数字排列顺序的菜单项将呈现出列表的形式显示在标准错误输出上,并显示PS3提示符请求用户输入(默认时,PS3的值为"#?").心啊是PS3提示符后,shell等待用户输入,输入的应当是菜单列表中的一个数字,输入值会保存在一个shell的特殊变量REPLY中国,它与选项列表中相应的括号后面的字符串相关联. case命令和select命令联合使用时,用户可以从菜单中进行选择,并基于选项执行相应的命令. 1)select 格式 selec

JavaScript函数部分

 对象: JavaScript的对象字面表示法允许仅仅列出对象的组成部分就能创建对象.这也是json的灵感来源.所谓的对象字面量就是包含在{}中的多组键值对. var stooge={ 'first_name' : 'jack' , 'last_name' : 'ma' }; 取对象内的值可以用stooge['first_name']或者是stooge.first_name. 从undefined的对象中取值是违法的,如stooge.name.me ,此时会报TypeError错误.解决办法是用

JavaScript中的函数表达式

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. FE特点分析 例子一:在下面代码中,"add"是一个函数对象

Javascript我学之二函数定义

本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘 函数 几个要点: a).函数是javascript中的一等公民 (重要性) b).函数是一个对象 c).函数定义了一个独立的变量作用域 定义方式 a)命名函数:           除非在另一个函数内部定义,否则,命名函数是全局的. 1 // 全局的命名函数 2 function add(x, y) { 3 return x + y; 4 } 5 console.info(add(100, 200)); //300 b)匿名函数: 匿名函

【链接】函数栈帧

本节通过反汇编可执行文件得到的文件,研究函数栈帧的相关内容: 栈帧整体示意图如下 示例代码 #include <stdio.h> #include <iostream> using namespace std; int z = 10; int add(int x, int y) { return x+y+z; } int inc20(int x) { int y = 10; return add(x, y); } int main(void) { int a = 30; a = i