nyoj 32-组合数(next_permutation, stack, set)
32-组合数
内存限制:64MB
时间限制:3000ms
Special Judge: No
accepted:8
submit:11
题目描述:
输入描述:
输入n、r。
输出描述:
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入:
5 3
样例输出:
543
542
541
532
531
521
432
431
421
321 分析:
①、要求从n个元素中选m个元素,其实就是从全排列中选择它的前m项就行了;
②、因为本题对顺序做了限制,所以我们还要将选出的元素排序、去重; 步骤:
①、首先来说,我们要产生一组全排列,这里我们通过STl中的next_permutation
②、将每个全排列前m项取出,排序后插入set(PS:set具有去重的功能)
③、将从set取出的每一个值依次放入栈(stack)中(利用栈的“先进后出”)
④、从栈(stack)中取出、输出 核心代码:
do
{
if(!equal(A, A + m, temp)) // 解释:如果数组A的前m个元素与temp两个数组不相等
{
for(int i = ; i < m; ++ i)
temp2[i] = temp[i] = A[i];
sort(temp2, temp2 + m, greater<int>());
string s;
for(int i = ; i < m; ++ i)
s += char('' + temp2[i]);
my_set.insert(s);
}
}
while(next_permutation(A, A + n));
C/C++代码实现(AC):
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set> using namespace std;
const int MAXN = ;
int A[MAXN]; void cal_array(int n)
{
for(int i = ; i < n; ++ i)
A[i] = i + ;
} int main()
{ int n, m, temp[MAXN] = {}, temp2[MAXN] = {};
scanf("%d%d", &n, &m);
set <string> my_set;
set <string> ::iterator iter;
stack <string> my_stack;
cal_array(n);
do
{
if(!equal(A, A + m, temp)) // 解释:如果数组A的前m个元素与temp两个数组不相等
{
for(int i = ; i < m; ++ i)
temp2[i] = temp[i] = A[i];
sort(temp2, temp2 + m, greater<int>());
string s;
for(int i = ; i < m; ++ i)
s += char('' + temp2[i]);
my_set.insert(s);
}
}
while(next_permutation(A, A + n)); for(iter = my_set.begin(); iter != my_set.end(); ++ iter)
my_stack.push(*iter);
while(!my_stack.empty())
{
cout <<my_stack.top() <<endl;;
my_stack.pop();
}
return ;
}
nyoj 32-组合数(next_permutation, stack, set)的更多相关文章
- nyoj 32 组合数
组合数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r< ...
- nyoj 32 组合数【简单dfs】
组合数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合 ...
- 全排列函数 nyoj 366(next_permutation()函数)
C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...
- nyoj 2 括号配对问题(stack)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0& ...
- NYOJ 53 最少步数
题 目 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58 思路借鉴 DFS-Deep First Search-深度优先 ...
- (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)
刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...
- [原]NYOJ-组合数-32
大学生程序代写 http://acm.nyist.net/JudgeOnline/problem.php?pid=32 /*组合数 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- [技术] OIer的STL入门教程
注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...
- [技术] OIer的C++标准库 : STL入门
注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...
随机推荐
- DP题 总结 [更新中]
建设中 ... 预防针 : 本蒟蒻代码风格清奇(⊙﹏⊙)b 一.选学霸 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所 ...
- 图像处理笔记(二十一):halcon在图像处理中的运用
概要: 分水岭算法做图像分割 二维码识别 稍后将其他几篇笔记全都补充上概要方便查询. 分水岭算法做图像分割 使用距离变换结合分水岭算法实现图像分割,可以用来分割仅通过阈值分割还是有边缘连接在一起的情况 ...
- 日天老师的django相关博客
Yuan先生的博客网址 1 Web应用 https://www.cnblogs.com/yuanchenqi/articles/8869302.html 2 http协议 https://www.cn ...
- Shiro learning - 认证流程(3)
Shiro认证流程 在学习认证流程之前,你应该先了解Shiro的基本使用流程 认证 身份认证: 证明用户是谁.用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证 ...
- Dubbo配置完全外部化实践,使用动态配置中心的注意事项
问题描述 近期开发项目,将Dubbo的配置全部外部化到动态配置中心.这里配置中心我使用的是Apollo. @Configuration public class DubboConfig { @Bean ...
- Java基础(43)Queue队列
Collection接口的第三个子接口是Queue接口,而Queue接口的子接口又是Deque接口和BlockingQueue接口. 实现了Deque接口的类有:ArrayDeque类.Concurr ...
- 设计模式(十一)Composite模式
Composite模式模式能够使容器与内容具有一致性,创造出递归结构.有时,与将文件夹和文件都作为目录条目看待一样,将容器和内容作为同一种东西看待,可以帮助我们方便地处理问题.在容器中既可以放入内容, ...
- python编译器的安装和pycharm的安装
python编译器的安装 进入官网https://www.python.org/,根据提示安装 安装python编译器 pychram安装 下载地址: https://www.jetbrains.co ...
- SpringCloud之Nacos服务注册(十八)
一 服务提供配置 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <arti ...
- commix工具配合命令注入
commix简介 commix是一款由python编写,开源自动化检测系统命令注入工具 https://github.com/commixproject/commix commix 参数 选项: - ...