题目连接: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. CSS未知div高度垂直居中代码_层和布局特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. log4net概述

    log4net概貌 log4net是一个框架,用来记录日志的框架.为什么要记录日志呢?每个程序员都不能保证自己的程序完全没有错误,可是当程序已经部署的时候出现错误怎么办?我们这时候就要根据我们的日志文 ...

  3. nodejs+socket.io即时聊天实例

    在这之前你应该先安装好 Node.js,安装过程不再讲解 首先在你的电脑上创建一个新目录,姑且命名为 chat,然后在该目录创建两个文件,分别是 app.js 和 index.html. app.js ...

  4. Swift - 异步获取网络数据封装类

    使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据.下面通过对数据获取类进行封装,演示如何进行数据请求与接收. 1,HttpContr ...

  5. Hook任务栏时钟窗口(原理其实很简单,就是注入DLL到时钟窗口进程(explorer.exe))

    用过一些日历软件的小伙伴应该都知道它们都实现了在时钟窗口上的Hook,也就是屏蔽了系统原有的功能,实现自己的功能 某日历软件Hook时钟窗口后的效果 经过一番研究,发现原理其实很简单,就是注入DLL到 ...

  6. JDWP

    JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用 ...

  7. memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间

    memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间 memcached vs MySQL Memory engin ...

  8. 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

    记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...

  9. sharepoint 2010 显示和隐藏Ribbon区域条

    在sharepoint 2010的页面中,我们在页面的最上方,有一条深灰色的Ribbon工具栏,如下图,这里可以通过下面的脚本,做一些脚本,来控制它的隐藏和显示. 最后把这些脚本,放在v4.maste ...

  10. Api之Cors跨域以及其他跨域方式

    Web Api之Cors跨域以及其他跨域方式(三)   我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还 ...