卡拉茲(Callatz)猜想已經(jīng)在1001中給出了描述。在這個(gè)題目里,情況稍微有些復(fù)雜捺宗。
當(dāng)我們驗(yàn)證卡拉茲猜想的時(shí)候,為了避免重復(fù)計(jì)算川蒙,可以記錄下遞推過程中遇到的每一個(gè)數(shù)蚜厉。例如對n=3進(jìn)行驗(yàn)證的時(shí)候,我們需要計(jì)算3畜眨、5昼牛、8、4康聂、2贰健、1,則當(dāng)我們對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è)測試輸入包含1個(gè)測試用例谓松,第1行給出一個(gè)正整數(shù)K(<100)星压,第2行給出K個(gè)互不相同的待驗(yàn)證的正整數(shù)n(1<n<=100)的值,數(shù)字間用空格隔開鬼譬。
輸出格式:
每個(gè)測試用例的輸出占一行娜膘,按從大到小的順序輸出關(guān)鍵數(shù)字。數(shù)字間用1個(gè)空格隔開优质,但一行中最后一個(gè)數(shù)字后沒有空格竣贪。
輸入樣例:
6
3 5 6 7 8 11
輸出樣例:
7 6
#include <iostream>
#include<set>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n,temp;
set<int> st;
scanf("%d",&n);
int ans[n];
vector<int> result;
for (int i=0;i<n;i++){
scanf("%d",&temp);
ans[i]=temp;
while(temp!=1){
if(temp%2==0){
temp=temp/2;
st.insert(temp);
}
else{
temp=(3*temp+1)/2;
st.insert(temp);
}
}
}
// for (set<int>::iterator i=st.begin();i!=st.end();i++){
// cout<<*i<<" ";
// }
sort(ans,ans+n,greater<int>());
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;
}
糾結(jié)問題
首先有三個(gè)測試用例不通過,百思不得其解巩螃,原因是邊界輸入只有一個(gè)數(shù)的時(shí)候會(huì)出錯(cuò)演怎,這時(shí)候result的size為很大,說明此時(shí)vector沒有添加任何數(shù)避乏,for循環(huán)邊界有問題爷耀,將n-1改成n