UVA 11136 Hoax or what (multiset)

题目大意:

超时进行促销,把账单放入一个箱子里

每次拿取数额最大的和最小的,给出 最大-最小  的钱。

问n天总共要给出多少钱。

思路分析:

multiset 上直接进行模拟

注意要使用long long

而且multiset的删除要用 迭代器。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <set>
#define maxn 111111
using namespace std;

multiset<int>tab;
multiset<int>::iterator it;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF && n)
    {
        tab.clear();

        long long ans=0;
        for(int i=0;i<n;i++)
        {
            int k;
            scanf("%d",&k);
            while(k--)
            {
                int a;
                scanf("%d",&a);
                tab.insert(a);
            }

            if(tab.size()==0)continue;
            it=tab.begin();
            int ans1=(*it);

            it=((tab.end()));
            it--;
            int ans2=(*it);

            ans+=(ans2-ans1);

            tab.erase(it);
            if(tab.size()>0)tab.erase(tab.begin());
        }
        printf("%lld\n",ans);
    }
    return 0;
}

UVA 11136 Hoax or what (multiset)

时间: 2024-10-10 15:31:12

UVA 11136 Hoax or what (multiset)的相关文章

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 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<in

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>

Multiset的使用 TOJ 2196.Nuanran&#39;s Idol II 与 UVA11136 Hoax or what

1 /* 2 ID: neverchanje 3 PROG: TOJ2195 4 LANG: C++11 5 */ 6 #include<iostream> 7 #include<set> 8 using namespace std; 9 10 char cmd; 11 int n,val; 12 int main(){ 13 // freopen("a.txt","r",stdin); 14 // freopen(".out&qu

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,