zoukankan      html  css  js  c++  java
  • POJ 1833 排列

    题意: 给你某个排列 求从下一个排列开始的第k个排列
    如果是最后一个排列 则下一个排列为1 2 3 ... n
    // 1 用stl 里面的 next_permutation
    // 2 用生成下一个排列算法
    // 1)从末尾开始找第一个正序 A[i-1]<A[i]
    // 2)从i开始找最大的j A[j]>A[i-1]
    // 3)交换 A[i-1],A[j]
    // 4)将下标从i开始的序列翻转

    #include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int s[2000]; int n,k; void change(int l,int r) { while(l<r) { swap(s[l],s[r]); l++; r--; } } int main() { int T; int i; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&k); for(i=0;i<n;i++) scanf("%d",&s[i]); while(k--) next_permutation(s,s+n); for(i=0;i<n-1;i++) printf("%d ",s[i]); printf("%d ",s[i]); } return 0; } /* 2 #include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int s[2000]; int n,k; void change(int l,int r) { while(l<r) { swap(s[l],s[r]); l++; r--; } } bool permutation() { int i=n-1; while(i>0&&s[i-1]>=s[i]) i--; if(!i) return false; int k=i,j=n-1; for(;j>i;j--) if(s[j]>s[i-1]){ k=j; break; } swap(s[i-1],s[k]); change(i,n-1); return true; } int main() { int T; int i; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&k); for(i=0;i<n;i++) scanf("%d",&s[i]); while(k--) { if(!permutation()) change(0,n-1); } for(i=0;i<n-1;i++) printf("%d ",s[i]); printf("%d ",s[i]); } return 0; } */

      

  • 相关阅读:
    第三套三
    多线程读写共享变量时,synchronized与volatile的作用
    jQuery源代码学习笔记:构造jQuery对象
    写入位置时发生訪问冲突
    Free Editor
    大区间素数筛选 POJ2689
    HDU
    CentOS下挂载U盘
    得到当前堆栈信息的两种方式(Thread和Throwable)的纠结
    [实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名
  • 原文地址:https://www.cnblogs.com/372465774y/p/3603061.html
Copyright © 2011-2022 走看看