uva 11136 multiset

用multiset模拟一下就可以了,需要注意的是erase(val)会将值等于val的全部删掉,而erase(iterator)只会删去该iterator指向的一个值。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <set>
 5 using namespace std;
 6
 7 multiset<int> s;
 8 multiset<int>::iterator it;
 9
10 int main ()
11 {
12     int n;
13     while ( scanf("%d", &n), n )
14     {
15         long long sum = 0;
16         s.clear();
17         for ( int i = 0; i < n; i++ )
18         {
19             int m;
20             scanf("%d", &m);
21             while ( m-- )
22             {
23                 int tmp;
24                 scanf("%d", &tmp);
25                 s.insert(tmp);
26             }
27             it = s.begin();
28             int lb = (*it);
29             s.erase(it);
30             it = s.end();
31             it--;
32             int ub = (*it);
33             s.erase(it);
34             sum += ub - lb;
35         }
36         printf("%lld\n", sum);
37     }
38     return 0;
39 }
时间: 2024-12-23 17:31:16

uva 11136 multiset的相关文章

UVA 11136 Hoax or what (multiset)

题目大意: 超时进行促销,把账单放入一个箱子里 每次拿取数额最大的和最小的,给出 最大-最小  的钱. 问n天总共要给出多少钱. 思路分析: multiset 上直接进行模拟 注意要使用long long 而且multiset的删除要用 迭代器. #include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <set> #define maxn

UVa 11136 Hoax or what (STL)

题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long long,和multiset,因为可能数是一样. 代码如下: #include <iostream> #include <cmath> #include <cstdlib> #include <set> #include <cstdio> using

UVA - 11020 Efficient Solutions(Multiset)

本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人,他是否有优势该如何判断呢?只需要看他左边相邻的点的y坐标是否比他小即可.而如果这个人是有优势的,那么需要先把这个人插入到集合中,然后从upper_bound(P)开始,逐个删除没有优势的点,注意删除时候应写为s.erase(it++),因为删除时候会导致指针向左移动一位,因此还需要it++.这样,

UVA - 11020 - Efficient Solutions (multiset实现BST)

Efficient Solutions 题目传送:Efficient Solutions AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string>

UVA 11020 Efficient Solutions+multiset的应用

题目链接:点击进入 首先来讲,很容易看到我们其实只要维护优势人群的集合:如果加入一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,如果没有,则将这个人插入集合中,但要注意到这个人的插入可能会让其它的人失去优势.所以要求这个集合要能支持快速查询和修改操作:而multiset恰好能能满足这个需要. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<set> us

UVA 1149 Bin Packing

传送门 A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the same length l and each item i has length li ≤ l. We look for a minimal number of bins q such that • each bin contains at most 2 items, • each item is pa

UVa - 10815 Andy&#39;s First Dictionary(STL)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18649 #include <iostream> #include <string> #include <set> #include <sstream> using namespace std; /******************************************************************

UVA 11020 - Efficient Solutions(set)

UVA 11020 - Efficient Solutions 题目链接 题意:每个人有两个属性值(x, y),对于每一个人(x,y)而言,当有另一个人(x', y'),如果他们的属性值满足x' < x, y' <= y或x' <= x, y' < y的话,这个人会失去优势,每次添加一个人,并输出当前优势人个数 思路:由于每个人失去优势后,不可能再得到优势,所以失去优势就可以当成删去这些点,这样的话,就可以用一个multiset来维护点集,每次加入一个点,利用lowerbound,

UVA - 11136Hoax or what(set)

题目:UVA - 11136Hoax or what(set) 题目大意:超市举办一个活动,活动期间,凡是来到超市购物的客人将小票放到一个抽奖箱中,每天结束经理从中间抽出两张小票,一张最高的消费额,一张最低的消费额.然后最高消费的那位客人将获得max - min价值的商品.然后将这两张小票扔掉.活动期间都这么抽出幸运的顾客.问这个活动需要准备花多少钱在提供奖品上. 解题思路:用multiset来存放小票的金额,然后在取出最大和最小. 代码: #include <cstdio> #include