日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

杭电2062java实现

發布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电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的就輸出當前值然后停止。
代碼如下:

import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class 杭電2062 {public static void main(String []args){ Scanner sc=new Scanner(System.in); long a[]= new long [21];//a[n]表示個數;一定要用長整形,不然數字越界a[1]=1;for(int i=2;i<21;i ){a[i]=i*(a[i-1] 1); }while(sc.hasNext()){ long m=sc.nextLong();long n=sc.nextLong();if(m<=0||m>20||n<=0||n>a[(int) m]) {break;}List list=new ArrayList();//初始化。for(int i=1;i<m 1;i ){list.add(i);} out(m,n,a,list);System.out.println(); } }private static void out(long m, long n,long a[],List list) {//m第幾個 a[m]總個數 n第幾個if(m==1) {System.out.print(list.get((int) (m-1)));}//不出意外輸出到最后else {long a1=a[(int) m]/m;//看每一小塊有多少個數long a2=(n-1)/a1 1;//當前要輸出數(其實也是位置第一位對應的是他本身,后面就不一定)。這樣可以避免剛好成倍數的數和前面分組不同int a3=(int)a2;if(n 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的杭电2062java实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。