1. 程式人生 > >PAT——1005. 繼續(3n+1)猜想 (25)

PAT——1005. 繼續(3n+1)猜想 (25)

ont con 驗證 避免 任務 alt 產生 system.in spa

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裏,情況稍微有些復雜。

當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想的真偽,而不需要重復計算,因為這4個數已經在驗證3的時候遇到過了,我們稱5、8、4、2是被3“覆蓋”的數。我們稱一個數列中的某個數n為“關鍵數”,如果n不能被數列中的其他數字所覆蓋。

現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重復驗證余下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。

輸入格式:每個測試輸入包含1個測試用例,第1行給出一個正整數K(<100),第2行給出K個互不相同的待驗證的正整數n(1<n<=100)的值,數字間用空格隔開。

輸出格式:每個測試用例的輸出占一行,按從大到小的順序輸出關鍵數字。數字間用1個空格隔開,但一行中最後一個數字後沒有空格。

輸入樣例:

6
3 5 6 7 8 11

輸出樣例:

7 6

 1 package com.hone.basicalTry;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.List;
6 import java.util.Scanner; 7 import java.util.Set; 8 import java.util.TreeSet; 9 10 /** 11 * @author Xia 12 * 思路:采用兩個容器,第一個容器用於裝過程數,第二個容器用來裝載所有的數 13 * 最後比較過程數中是否包含有所有數中任意一個。如果不包含則說明是關鍵數。 14 * 15 */ 16 public class Test1005Continue3nPlusOne { 17 public static void main(String[] args) { 18
Scanner ss = new Scanner(System.in); 19 int n = Integer.parseInt(ss.nextLine()); 20 Set<Integer> progress = new TreeSet<>(); //過程中產生的數(這裏優先使用TreeSet可以避免添加冗雜數據) 21 List<Integer> allNum = new ArrayList<>(); //所有的數 22 for (int i = 0; i < n; i++) { 23 int a = ss.nextInt(); 24 allNum.add(a); 25 if (!progress.contains(a)) { //首先判斷a是否在過程數容器中,如果不在則開始按照假定的開始計算 26 while (a != 1) { 27 if (a%2 ==0) { 28 a = a/2; 29 progress.add(a); 30 }else { 31 a = (3*a+1)/2; 32 progress.add(a); 33 } 34 } 35 } 36 37 } 38 39 for (int i = 0; i < allNum.size(); i++) { 40 if (progress.contains(allNum.get(i))) { 41 allNum.remove(i); 42 i--; 43 } 44 } 45 Collections.sort(allNum); 46 for (int i = allNum.size()-1; i > 0; i--) { 47 System.out.print(allNum.get(i)+" "); 48 } 49 System.out.println(allNum.get(0)); 50 } 51 }

PAT——1005. 繼續(3n+1)猜想 (25)