CC ANUMLA(STL的运用)
题目连接: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的运用)的更多相关文章
- STL 堆
洛谷P3378 [模板]堆 #include <iostream> #include <cstdio> #include <algorithm> #include ...
- c++ STL 学习记录 草稿。
非常丑陋的尝试实现stl.慢慢修改吧. 1)简单实现 vector和list. 2)思索如何开始编写算法. 1,所有容器继承一个抽象容器.那么算法就可以使用抽象基类的next方法来遍历元素. 容器间耦 ...
- STL区间成员函数及区间算法总结
STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...
- 高效的使用STL
高效的使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍: 熟悉以下条款,高效的使用STL: 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要 ...
- 常用的STL查找算法
常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...
- [转] 深入剖析 linux GCC 4.4 的 STL string
本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术. 平台:x86_64-redhat-linux gcc ver ...
- C++STL之string (转)
在学习c++STL中的string,在这里做个笔记,以供自己以后翻阅和初学者参考. 1:string对象的定义和初始化以及读写 string s1; 默认构造函数,s1为空串 string ...
- C++STL之String
本文直接转载,非原创!仅记录供自己学习之用. 出处:http://blog.csdn.net/y990041769/article/details/8763366 在学习c++STL中的string, ...
- STL——配接器、常用算法使用
学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...
随机推荐
- android 定时拍照并发送微博
最近在做android方面的开发,下面是android自动对焦并拍照的小例子: package com.comnvi.camera; import java.io.File; import java. ...
- EasyUI - DataGrid 组建 - [ 排序功能 ]
效果: 红框的字段看,为设置了,列排序,向后台Post数据sort/order. 原理:向后台POST数据,sort/post数据. html代码: <table id="tab&qu ...
- Basic4android:多功能的Android应用软件快速开发平台
Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...
- Android:解决client从server上获取数据乱码的方法
向server发送HTTP请求.接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity()," ...
- Oracle表连接总结
1 简述 1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结 ...
- Spark SQL Catalyst源代码分析之TreeNode Library
/** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...
- iOS开发经常使用宏定义
iOS开发经常使用宏定义 iOS开发中经常须要获取屏幕宽度高度,为view设置颜色,为imgagView设置图片等,我们都可定义一些宏,随时都可拿来使用,方便开发 <span style=&qu ...
- POJ 1160 Post Office (动态规划)
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15412 Accepted: 8351 Desc ...
- 正則表達式验证邮箱,qq,座机,手机,网址
手机: var reg=/^1[34578]\d{9}$/; if(reg.test("你输入的手机号码") ) { alert("手机号码输入正确") } e ...
- 带着项目学PHP第九讲 - 如何给ecshop的wap版本首页和商品页添加商品图片
ecshop的wap版本自身不带图片, 所以看起来光秃秃的,非常不讨人喜欢, 网络上关于wap的模板就不像pc版那么多,容易找到, 而且能找到的都是要花钱买的, 虽然这个小小的改动不能替代找个合适的模 ...