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