1005. 继续(3n+1)猜想 (25)
題目
https://www.patest.cn/contests/pat-b-practise/1005
當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。例如對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分析
因為只有不到100個數,而且數的范圍也很小(1~100),因此只要只要為每個數設置一個布爾類型的變量,被覆蓋就標記一下就好。
但是要注意,雖然最大的數不會超過100,但當n=99的時候,((3n)+1)/2=149,((3149)+1)/2=224因此數組要盡量開大些,因為只是bool類型,完全不用擔心超過內存限制。
AC代碼
#include "bits/stdc++.h" using namespace std; int main(int argc, char const *argv[]) {int K;cin >> K;int a[K];bool ans[910];memset(ans, false, sizeof(ans)); //初始化未被覆蓋for(int i = 0; i<K; i++){cin >> a[i];int t = a[i];while(t!=1){if(t&1){ //oddt = ((3*t)+1)/2;}else{ // event /= 2;}if(ans[t]){ //已經被覆蓋過break;}else{ans[t] = true;}}}std::vector<int> v;for(int i=0;i<K;i++){int t = a[i];if(!ans[t]) v.push_back(t);}sort(v.begin(), v.end(), greater<int>());cout << v[0];if(v.size() > 1){for(auto i = v.begin()+1; i != v.end(); i++)cout << ' ' << *i;}return 0; }轉載于:https://www.cnblogs.com/lepeCoder/p/pat-b-practise-1005.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的1005. 继续(3n+1)猜想 (25)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]MyBatis中resultTyp
- 下一篇: Verilog MIPS32 CPU(一