题目连接:http://www.codechef.com/problems/ANUMLA

题意:给一个序列所有子集和(2^n个子集),复原这个序列。。。

如:0 1 1 2 2 3 3 4 原序列为1 1 2

分析:每次找出最小的那个元素,再删除掉可能由该元素相加得到的元素,如上面那个例子,将所有可能相加得到其他元素存在一个数组add中,0是空集,先去掉,剩下第一个元素1必定是原序列最小元素,取出答案数组ans中,一步步下去。

1.取出1放进ans数组中,ans数组:1   相加辅助数组add:1,删除1后原序列:1 2 2 3 3 4

2.取出最小元素1放进ans数组,ans数组1 1   相加辅助数组add:1 1 2(1+1,1),删除1,2后序列:2 3 3 4

3.取出最小元素2放进ans数组,ans数组1 1 2   相加辅助数组add:1 1 2 2 3 3 4(1+2,1+2,2+2,2),删除2,3,3,4后原序列已空。

同样序列0 2 5 7 10 12 15 17去掉0,原序列为 2 5 7 10 12 15 17

1.取出1放进ans数组中,ans数组:2   相加辅助数组add:2,删除2后原序列: 5 7 10 12 15 17

2.取出最小元素5放进ans数组,ans数组2 5   相加辅助数组add:2,5,7(2+5,5),删除5,7后序列:10 12 15 17

3.取出最小元素10放进ans数组,ans数组2 5 10   相加辅助数组add:2 5 7 10 12 15 17(10+2,10+5,10+7,10),删除2,3,3,4后原序列已空。

这题用STL中的multiset处理起来太方便了。

#include<bits/stdc++.h>
using namespace std;
multiset<int>Set;
vector<int>ans,add;
int main()
{
int T,n,x;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
Set.clear();ans.clear();add.clear();
for(int i=;i<(<<n);i++)
{
scanf("%d",&x);
Set.insert(x);
}
Set.erase();
x=n;
while(x--)
{
int mn=*(Set.begin());//取出最小元素放进ans数组
ans.push_back(mn);
for(int i=,sz=add.size();i<sz;i++)
{
int ad=add[i]+mn;add.push_back(ad);
Set.erase(Set.find(ad));//删除由各个元素相加得到的子集
}
add.push_back(mn);
Set.erase(Set.find(mn));
}
for(int i=,sz=ans.size();i<sz;i++)printf("%d%c",ans[i],(i==n-)?'\n':' ');
}
}

CC ANUMLA(STL的运用)的更多相关文章

  1. STL 堆

    洛谷P3378 [模板]堆 #include <iostream> #include <cstdio> #include <algorithm> #include ...

  2. c++ STL 学习记录 草稿。

    非常丑陋的尝试实现stl.慢慢修改吧. 1)简单实现 vector和list. 2)思索如何开始编写算法. 1,所有容器继承一个抽象容器.那么算法就可以使用抽象基类的next方法来遍历元素. 容器间耦 ...

  3. STL区间成员函数及区间算法总结

    STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...

  4. 高效的使用STL

    高效的使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍: 熟悉以下条款,高效的使用STL: 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要 ...

  5. 常用的STL查找算法

    常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...

  6. [转] 深入剖析 linux GCC 4.4 的 STL string

    本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术. 平台:x86_64-redhat-linux gcc ver ...

  7. C++STL之string (转)

    在学习c++STL中的string,在这里做个笔记,以供自己以后翻阅和初学者参考. 1:string对象的定义和初始化以及读写 string s1;      默认构造函数,s1为空串 string ...

  8. C++STL之String

    本文直接转载,非原创!仅记录供自己学习之用. 出处:http://blog.csdn.net/y990041769/article/details/8763366 在学习c++STL中的string, ...

  9. STL——配接器、常用算法使用

    学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...

随机推荐

  1. 三篇IMO的文章

    http://column.iresearch.cn/b/201411/687499.shtml?from=singlemessage&isappinstalled=1 http://colu ...

  2. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

  3. WEB服务器、应用程序服务器区别

    WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器 ...

  4. uva 10951 - Polynomial GCD(欧几里得)

    题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...

  5. Android开发系列(二十八):使用SubMenu创建选项菜单

    大部分手机上边都会有一个"MENU"键,在一个应用安装到手机上之后,能够通过"MENU"显示该应用关联的菜单. 可是,从Android 3.0開始,Androi ...

  6. 486E - LIS of Sequence(LIS)

    题意:给一个长度为n的序列.问每一个数关于序列的LIS(longest increasing subsequence)是什么角色. 这里分了三种: 1.此数没有出如今随意一条LIS中 2.此数出如今至 ...

  7. mysql存储过程及经常使用函数

    一.函数 1.数学函数 CEIL()进一取整 SELECT CEIL(1.2);2 FLOOR()舍一取整 SELECT FLOOR(1.9);9 MOD取余数(取模) SELECT MOD(3,8) ...

  8. 2015 Multi-University Training Contest 8

    Hdu 5385 The path 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5385 题意:有一个联通的有向图,d(x)用来记录从1点到x点的最短 ...

  9. HDU 2098 分拆素数和(素数)

    HDU 2098 分拆素数和(素数) http://acm.hdu.edu.cn/showproblem.php?pid=2098 题意: 给你一个偶数,问你这个偶数有多少种方式能由两个不同的素数构成 ...

  10. 中介者模式 C++ 实现

    #include<iostream> #include<string> #include<vector> #include<cstdlib> using ...