题目连接: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. js 常用方法记事本

    1.获取被选中行的名称<tab选项卡中为iframe> /* S 获取首页被选中的选项卡名称 */ var currTab = $("#layout_center_tabs&qu ...

  2. 【水】HDU 2099——整除的尾数

    来源:点击打开链接 数据范围小,枚举水过就行了……不过要注意格式! #include <iostream> #include <cstring> #include <io ...

  3. Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现..   例子相关博文:Androi ...

  4. Eclipse 乱码问题 修改设置

    1.工作空间的字符编码设置 2.对于任意的项目,可以右键选择属性,然后修改 3.对于任意一个文件,同样的操作,右键选择属性,然后配置字符编码

  5. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET     boost::crc_32_type crc32;       crc32. ...

  6. 积累的VC编程小技巧之属性页

    1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框 ...

  7. tomcat path设置

    zjtest7-app:/usr/local/apache-tomcat-7.0.55_8082/logs# netstat -nap | grep 8082 tcp 0 0 :::8082 :::* ...

  8. HDU3714 Error Curves (单峰函数)

    大意: 给你n个二次函数Si(x),F(x) = max{Si(x)} 求F(x)在[0,1000]上的最小值. S(x)=ax^2+bx+c       (0<=a<=100, |b|, ...

  9. 做web项目时对代码改动后浏览器端不生效的应对方法(持续更新)

    做web项目时,常常会遇到改动了代码,但浏览器端没有生效,原因是多种多样的,我会依据我遇到的情况逐步更新解决的方法 1.执行的时候採用debug模式,普通情况下使用项目部署button右边那个butt ...

  10. 第十七篇:实例分析(1)--初探WDDM驱动学习笔记(八)

    第四篇(VidPN)中提到过MIRROR驱动. 在进入本篇的实际内容前, 带着好奇心, 想请教CSDN中的显卡驱动方面的大虾, 怎样才干把这个驱动玩起来, 这个驱动的作用是什么,等等, 敬请不吝赐教. ...