卡拉茲(Callatz)猜想已經(jīng)在1001中給出了描述暇务。在這個(gè)題目里垦细,情況稍微有些復(fù)雜挡逼。
當(dāng)我們驗(yàn)證卡拉茲猜想的時(shí)候挚瘟,為了避免重復(fù)計(jì)算,可以記錄下遞推過程中遇到的每一個(gè)數(shù)憔涉。例如對(duì)n=3進(jìn)行驗(yàn)證的時(shí)候兜叨,我們需要計(jì)算3国旷、5跪但、8屡久、4爱榔、2详幽、1唇聘,則當(dāng)我們對(duì)n=5、8、4谎亩、2進(jìn)行驗(yàn)證的時(shí)候匈庭,就可以直接判定卡拉茲猜想的真?zhèn)乌宄郑恍枰貜?fù)計(jì)算,因?yàn)檫@4個(gè)數(shù)已經(jīng)在驗(yàn)證3的時(shí)候遇到過了蒜绽,我們稱5躲雅、8相赁、4钮科、2是被3“覆蓋”的數(shù)。我們稱一個(gè)數(shù)列中的某個(gè)數(shù)n為“關(guān)鍵數(shù)”桨嫁,如果n不能被數(shù)列中的其他數(shù)字所覆蓋。
現(xiàn)在給定一系列待驗(yàn)證的數(shù)字,我們只需要驗(yàn)證其中的幾個(gè)關(guān)鍵數(shù)噩凹,就可以不必再重復(fù)驗(yàn)證余下的數(shù)字驮宴。你的任務(wù)就是找出這些關(guān)鍵數(shù)字,并按從大到小的順序輸出它們迎罗。
輸入格式:
每個(gè)測(cè)試輸入包含1個(gè)測(cè)試用例纹安,第1行給出一個(gè)正整數(shù)K(<100)厢岂,第2行給出K個(gè)互不相同的待驗(yàn)證的正整數(shù)n(1<n<=100)的值塔粒,數(shù)字間用空格隔開映跟。
輸出格式:
每個(gè)測(cè)試用例的輸出占一行努隙,按從大到小的順序輸出關(guān)鍵數(shù)字荸镊。數(shù)字間用1個(gè)空格隔開躬存,但一行中最后一個(gè)數(shù)字后沒有空格。
#include <iostream>
#include<set>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n,temp;
set<int> st; //使用set存儲(chǔ)中間覆蓋的所有結(jié)果
scanf("%d",&n);
int ans[n];
vector<int> result; //使用vector存儲(chǔ)n所有“關(guān)鍵數(shù)”
for (int i=0;i<n;i++){
scanf("%d",&temp);
ans[i]=temp;
while(temp!=1){
if(temp%2==0){
temp=temp/2;
}
else{
temp=(3*temp+1)/2;
}
st.insert(temp);
}
}
// for (set<int>::iterator i=st.begin();i!=st.end();i++){ //測(cè)試vector中的元素
// cout<<*i<<" ";
// }
sort(ans,ans+n,greater<int>()); //對(duì)數(shù)組進(jìn)行排序替蔬,greater表示大的優(yōu)先極高承桥,排在前面
for (int i=0;i<n;i++){
if(!st.count(ans[i])){
result.push_back(ans[i]);
}
}
for(int i=0;i<result.size()-1;i++){
printf("%d ",result[i]);
}
printf("%d",result[result.size()-1]);
return 0;
}
注意事項(xiàng)
1.對(duì)數(shù)組的排序 less greater
2.set vector 的使用
3.首先有三個(gè)測(cè)試用例不通過,百思不得其解屯掖,原因是邊界輸入只有一個(gè)數(shù)的時(shí)候會(huì)出錯(cuò),這時(shí)候result的size為很大,說明此時(shí)vector 沒有添加任何數(shù)椎咧,for循環(huán)邊界有問題,將n-1改成n