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 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...
随机推荐
- 关于seaJs合并压缩(gulp-seajs-combine )路径与文件ID匹配问题。
前段时间和有大家介绍过用 gulp-seajs-combine 来打包seaJs文件.大家会发现合并seaJs一个很奇怪的现象,那就是它的 ID和路径匹配原则.使得有些文件已经合并过去了,但还是会提示 ...
- STL的vector略解
本文部分内容参考于这儿. vector 的基础知识,上文已经阐述地很详尽了.笔者谨给出 vector 的声明及其常用函数. 代码抬头需包含 #include<vector> using n ...
- VoodooPad Mac笔记本
VoodooPad Mac笔记本 VoodooPad是记录您的笔记和想法的地方.想法,图片,列表,密码和妈妈的苹果派食谱.包括您需要跟踪和组织的所有内容,VoodooPad会与您一起成长而不会妨碍您. ...
- 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算
<利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...
- Eureka -- 浅谈Eureka
目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...
- Linux常用命令-不定时记录
文件移动命令 命令格式:mv [-fiv] source destination 参数说明:-f:force,强制直接移动而不询问-i:若目标文件(destination)已经存在,就会询问是否覆盖- ...
- Kafka权威指南阅读笔记(第八章)
跨集群数据镜像 使用场景: 区域集群和中心集群 这种场景下,每个区域的应用程序只访问相应的区域内的集群.而有些情况下,需要将各个集群的信息汇总到中心集群,就可以用中心集群分析业务数据了. 冗余 一个K ...
- Linux wget 批量下载
需求:已知50个pdf的URL地址,需要批量下载,该怎么办呢? 方案一:使用wget自带的一个功能 -i 选项 从指定文件中读取下载地址,这样的好处是一直是这一个wget进程下载所有pdf,不会来回 ...
- C语言I博客作业07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-1/homework/9931 我在这个课程的目标 ...
- Django学习day8——admin后台管理和语言适应
Django最大的优点之一,就是体贴的为你提供了一个基于项目model创建的一个后台管理站点admin.这个界面只给站点管理员使用,并不对大众开放. 1. 创建管理员用户 (django) E:\Dj ...