杭电2062java实现
問題描述
考慮總= { 1,2,…,n }。例如,A1 = { 1 },A3 = { 1,2,3 }。子集序列被定義為非空子集的數(shù)組。對詞典編纂順序中的所有子集進行排序。你的任務(wù)是找到第m個。
輸入
輸入包含幾個測試用例。每個測試用例由兩個數(shù)字n和m組成(0< n<= 20, 0< m<= a的子集序列的總數(shù))。
輸出
對于每個測試用例,您應(yīng)該輸出一行中的m-th子集序列。
樣例輸入
1
2 1
2 - 2
2 3
2 4
3 10
樣例輸出
1
1
1 2
2
2 1
1 2 3
問題分析:首先要找到對應(yīng)n的總共排列方式。
n=1 :
1
n=2 :
1
1 2
2
2 1
n=3 :
1
1 2
1 2 3
1 3
1 3 2
2
2 1
2 1 3
2 3
2 3 1
3
3 1
3 1 2
3 2
3 2 1
可以分析得到新的可以平均分為n塊,每塊就是在第一位的基礎(chǔ)上加上類似上一個數(shù)的排序方式和一個空集。這樣就得到a[i]=i*(a[i-1] 1)表示總次數(shù)。
然而,排列的規(guī)律也可以找到。分成n塊后,你就可以找到m所屬的大區(qū)塊,就可以先輸出這個數(shù),然后在查看這個數(shù)在小n區(qū)間內(nèi)的余數(shù)(詳細看代碼)。再次使用類似的輸出方式,直到結(jié)束為止。
你或許會疑問雖然找到小區(qū)間的分配方式相同,但是數(shù)字變了怎么變,可以用到Java集合初始化,然后標(biāo)記位置,刪除已經(jīng)輸出的元素。實行遞歸。有一點,如果余數(shù)剛好是1的就輸出當(dāng)前值然后停止。
代碼如下:
總結(jié)
以上是生活随笔為你收集整理的杭电2062java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电oj2072,2091字符串java
- 下一篇: 杭电oj1003java实现