1. 程式人生 > >[poj1833 排列]求數列的全排列中的後k項

[poj1833 排列]求數列的全排列中的後k項

排列
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 16791 Accepted: 6719

Description

題目描述:
大家知道,給出正整數n,則1到n這n個數可以構成n!種排列,把這些排列按照從小到大的順序(字典順序)列出,如n=3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六個排列。

任務描述:
給出某個排列,求出這個排列的下k個排列,如果遇到最後一個排列,則下1排列為第1個排列,即排列1 2 3…n。
比如:n = 3,k=2 給出排列2 3 1,則它的下1個排列為3 1 2,下2個排列為3 2 1,因此答案為3 2 1。

Input

第一行是一個正整數m,表示測試資料的個數,下面是m組測試資料,每組測試資料第一行是2個正整數n( 1 <= n < 1024 )和k(1<=k<=64),第二行有n個正整數,是1,2 … n的一個排列。

Output

對於每組輸入資料,輸出一行,n個數,中間用空格隔開,表示輸入排列的下k個排列。

Sample Input

3
3 1
2 3 1
3 1
3 2 1
10 2	
1 2 3 4 5 6 7 8 9 10

Sample Output

3 1 2
1 2 3
1 2 3 4 5 6 7 9 8 10

Source

[email protected]

題目沒意思。只是為了測一下一個所謂的快速輸出。根據大家的直覺,這個快速輸出一定沒有Printf直接列印整數快,而且cout肯定沒有printf快。但是本例可以看出,poj還真是有一點奇葩,輸入直接上讀入外掛,這個應該是沒有問題的。輸出部分,printf超時,cout500ms,遞迴putchar列印47ms...
1833
Accepted 324K 47MS G++ 799B
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX = 10240;
int a[MAX];

inline int read() {
	char ch;
	while ((ch = getchar()) < '0' || ch > '9');
	int x = ch - '0';
	while ((ch = getchar()) >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + ch - '0';
	}
	return x;
}

void Print(int x) {
	if (x == 0) return;
	Print(x / 10);
	putchar(x % 10 + '0');
}

int main() {
	int m, n, k;
	m = read();
	while (m--) {
		//scanf(" %d %d", &n, &k);
		n = read();
		k = read();
		for (int i = 0; i < n; ++i) a[i] = read();//scanf(" %d", a + i);
		while (k--) next_permutation(a, a + n);
		Print(a[0]);//printf("%d", a[0]);
		for (int i = 1; i < n; ++i) {
			putchar(' ');
			Print(a[i]); //printf(" %d", a[i]);
		}
		putchar('\n');
	}
	return 0;
}

這你也信?!!

相關推薦

[poj1833 排列]數列排列k

排列 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16791 Accepted: 6719 Description 題目描述: 大家知道,給出正整數n,則1到n這n個數可以構成n!種排列,把這

暴力解法的列舉排列,生成排列

**對於一個長度為n陣列長度的陣列={0,1,2,3,..., n-1}。要想列舉它的所有的長度為n的全排列出來。** 有兩種選擇:一個是直接列舉, 另外一個是使用遞迴來構造。 先說最容易理解的直接列舉。 例如當 n=5 的時候,我們生成的排列從小到

給定樹的序和排列先序排列

問題描述  給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度<=8)。輸入格式  兩行,每行一個字串,分別表示中序和後序排列輸出格式  一個字串,表示所求先序排列  樣例輸入  BADC  BDCA樣例輸出       ABCD演

字串排列 python實現

演算法思想 輸入一個字串,列印這個字串中字元的全排列。 eg: 輸入:abc 輸出:abc acb bac bca cab cba 思路:將求字串的全排列分解為兩步: 第一步是確定第一個位置的字元,就

CF 303A(Lucky Permutation Triple-打表-數列排列)

A. Lucky Permutation Triple time limit per test 2 seconds memory limit per test 256 megabyt

下一排列問題(排列暴力)

A Number PuzzleTime Limit: 1000 ms /Memory Limit: 32768 kbDescriptionLele 最近上課的時候都很無聊,所以他發明了一個數字遊戲來打發時間。這個遊戲是這樣的,首先,他拿出幾張紙片,分別寫上0到9之間的任意數字

有重複元素的排列問題//利用排列函式

題目描述 設R={r1,r2,……,rn}是要進行排列的n個元素。其中元素r1,r2,……,rn可能相同。使設計一個演算法,列出R的所有不同排列。 給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。 輸入輸出格式 輸入格式: 第1行:元素個數n(1<=n&

排列組合之排列 (輸入一個字串,輸出該字串包含的字元的所有組合)

因為專案需求,要用到全排列,在此記錄下來。全排列公式: f(n) = n! (n>=0)  此demo為,輸入一個字串,遍歷字串中每個字元,並組成一個新的字串。通過遞迴演算法,得到所有字

演算法基礎:排列組合問題-排列(Golang實現)

【排列組合問題】 一共N輛火車(0<N<10),每輛火車以數字1-9編號,要求以字典序排序輸出火車出站的序列號。 輸入: 包括N個正整數(0<N<10),範圍為1到9,數字之間用空格分割,字串首位不包含空格。 輸出: 輸出以字典

演算法12--topK一個數組k大的數

求一個數組中第k大的值 解法一: 建立一個k個元素的最大堆,首先將陣列中前k個元素放入堆中,此時堆頂元素為第k大的元素,後面繼續遍歷陣列,比較堆頂元素與陣列中元素值,當陣列中元素小於堆頂元素時,將堆頂元素彈出,新元素入堆,這樣最終堆頂元素即為第k大。 可以直接利用Jav

一個數組k大的數,要求不能另外申請空間,陣列順序不能被改變

這是一道今日頭條的面試題,當面試官提出這樣一道題目時。我想相信,大多數人都會這樣反應 1.是不是可以先排一下序,然後再求第k大的,然後就想到陣列順序不能被改變,然後否定了 2.是不是可以用小堆來做。我建立一個堆大小為k的小堆,然後把這些資料全部扔進小堆中,除了堆頂,其他的數

一個無序陣列K小問題

這種問題如果先排序,那麼至少時間複雜度為O(nlogn) 但是有種方法可以達到O(n) 這種方法有個闕值,只有大於44的時候用這種方法才比先排序後查詢的快 首先上一段虛擬碼吧 if(N<44) then 排序A return A[K]; ---O(1) else

格雷碼、排列、約瑟夫環、m個元素n個元素的所有集合

格雷碼: 格雷碼是指,通過0-1的串來求出對應位數的所有可能。例如2的格雷碼:00、01、10、11 //格雷碼 例如2:00 01 10 11 void print(vector<int> &veNum) { for (int i = 1; i

二叉樹的排列先序/先序排列

7-8 根據後序和中序遍歷輸出先序遍歷 (25 分) 本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。 輸入格式: 第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔

先序排列(二叉樹已知序和序,先序)

ostream ble sta EDA 題目 sam test c++ adc 問題 A: [2001_p3]求先序排列 時間限制: 1 Sec 內存限制: 125 MB提交: 90 解決: 73 題目描述 給出一棵二叉樹的中序與後序排列。求出它的先序排列

數列還原(排列

for rip 幫助 個數字 item [0 str pan subject 題目描述 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置(不超過 10 個)看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是

牛客網NowCoder 2018年全國多校算法寒假訓練營練習比賽(第四場)A.石油采集(dfs) B.道路建設(最小生成樹prim) C.交集(暴力) F.Call to your teacher(迪傑斯特拉亂用) H.老子的排列呢(dfs)

初始 -o 地圖 意義 技術 tle bject ios urn 菜哭了。。。 A.石油采集 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 鏈

如何先序排列排列——hihocoder+洛谷例題【二叉樹遞歸搜索】

define second [] tor 記錄 例題 .com 內存限制 行為 【已知先序、中序求後序排列】: [#1049 : 後序遍歷](http://hihocoder.com/problemset/problem/1049) 時間限制:10000ms 單點時限:1

C++排列函式next_permutation 用法

全排列參考了兩位的部落格 感謝! http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html http://blog.csdn.net/ac_gibson/article/details/45308645 早就聽說了了next_per

牛客網 之 數列還原(數列排列演算法)

題目描述 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置(不超過 10 個)看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是指滿足 i < j 且 A[i] < A[j] 的對