32-组合数

内存限制:64MB
时间限制:3000ms
Special Judge: No

accepted:8
submit:11

题目描述:

找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。

输入描述:

输入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)的更多相关文章

  1. nyoj 32 组合数

    组合数 时间限制:3000 ms  |            内存限制:65535 KB 难度:3   描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r< ...

  2. nyoj 32 组合数【简单dfs】

    组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合 ...

  3. 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...

  4. nyoj 2 括号配对问题(stack)

    括号配对问题 时间限制:3000 ms  |            内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0& ...

  5. NYOJ 53 最少步数

    题      目    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58 思路借鉴   DFS-Deep First Search-深度优先 ...

  6. (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)

    刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...

  7. [原]NYOJ-组合数-32

    大学生程序代写 http://acm.nyist.net/JudgeOnline/problem.php?pid=32 /*组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度: ...

  8. [技术] OIer的STL入门教程

    注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...

  9. [技术] OIer的C++标准库 : STL入门

    注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...

随机推荐

  1. Hadoop(MapR)分布式安装及自动化脚本配置

    MapR的分布式集群安装过程还是很艰难的,远远没有计划中的简单.本人总结安装配置,由于集群有很多机器,手动每台配置是很累的,编写了一个自动化配置脚本,下面以脚本为主线叙述(脚本并不完善,后续继续完善中 ...

  2. 《疯狂java-突破程序员基本功的16课 》笔记总结

    本人最近读完<疯狂java-突破程序员基本功的16课 >读完后,感觉对java基础又有了新的认识,在这里总结一下:一.数组与内存控制 1.1 数组初始化     java语言的数组是静态的 ...

  3. Android Studio 模拟器Intel 加速

    Starting emulator for AVD 'Phone1'emulator: ERROR: x86 emulation currently requires hardware acceler ...

  4. [BZOJ1054] 移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2741  Solved: 1537[Submit][Stat ...

  5. opencv::模糊图像2

    中值滤波 统计排序滤波器 中值对椒盐噪声有很好的抑制作用 medianBlur(Mat src, Mat dest, ksize) 双边滤波 均值模糊无法克服边缘像素信息丢失缺陷.原因是均值滤波是基于 ...

  6. Apache Flink 入门示例demo

    在本文中,我们将从零开始,教您如何构建第一个Apache Flink (以下简称Flink)应用程序. 开发环境准备 Flink 可以运行在 Linux, Max OS X, 或者是 Windows ...

  7. echarts画中国地图,省市区地图分享

    中国地图 四川地图 重庆地图 源码分享: https://github.com/livelyPeng/ec-map

  8. [线段树系列] LCT打延迟标记的正确姿势

    这一篇博客将教你什么? 如何用LCT打延迟标记,LCT和线段树延迟标记间的关系,为什么延迟标记要这样打. ——正片开始—— 学习这一篇博客前,确保你会以下知识: Link-Cut-Tree,普通线段树 ...

  9. python 读取文件夹中的文件内容

    看thinking in java的时候发现有个题的答案不确定结果, 于是下载答案看下,结果是 这个样子的,这样要怎么才能找到相对应的答案?于是我就着手写了一个快速遍历的脚本(我这里只是单纯的找了出来 ...

  10. 课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类

    异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象.例如:数组越界和被0除. 代码验证: package test ...