1005. 繼續(3n+1)猜測

1005. 繼續(3n+1)猜測 (25)

時間限制
400 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
做者
CHEN, Yue

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

當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對n=3進行驗證的時候,咱們須要計算三、五、八、四、二、1,則當咱們對n=五、八、四、2進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這4個數已經在驗證3的時候遇到過了,咱們稱五、八、四、2是被3「覆蓋」的數。咱們稱一個數列中的某個數n爲「關鍵數」,若是n不能被數列中的其餘數字所覆蓋。spa

如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。code

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

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

輸入樣例:
6
3 5 6 7 8 11
輸出樣例:
7 6
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 bool cmp(int x, int y)
 9 {
10     return x > y;
11 }
12 
13 int main()
14 {
15     int a[110], hashtable[110] = {};
16     int k, i;
17     scanf("%d", &k);
18     for(i = 0; i < k; i++)
19     {
20         scanf("%d", &a[i]);
21         int temp = a[i];
22         while(temp != 1)
23         {
24             if(temp % 2 == 0)
25             {
26                 temp /= 2;
27                 if(temp <= 100)
28                 {
29                     hashtable[temp] = 1;
30                 }
31             }
32             else
33             {
34                 temp = (3 * temp + 1) / 2;
35                 if(temp <= 100)
36                 {
37                     hashtable[temp] = 1;
38                 }
39             }
40         }
41     }
42     int b[110], j = 0;
43     sort(a, a + k, cmp);
44     for(i = 0; i < k; i++)
45     {
46         int temp = a[i];
47         if(hashtable[temp] == 0)
48         {
49             b[j++] = a[i];
50         }
51     }
52     for(i = 0; i < j - 1; i++)
53     {
54         printf("%d ", b[i]);
55     }
56     printf("%d\n", b[j - 1]);
57     return 0;
58 }
相關文章
相關標籤/搜索