PAT乙級1005: 繼續(3n+1)猜想
阿新 • • 發佈:2018-12-14
題目:
解題思想:
把輸入的數列儲存到m中,把每次被覆蓋數放在v中,把關鍵數放在mkey中。每次檢驗m中第一個數,把得到的被覆蓋數儲存在V中,再把m和mkey中和v中相同的數字刪除。
題解:
#include<iostream> #include<map> #include<vector> using namespace std; int main() { // freopen("D://test.txt","r",stdin); int k,num; cin>>k; map<int,int> mkey,m; for(int i=0;i<k;i++) { cin>>num; m[num]=1; } while(!m.empty()) { auto it=m.begin(); vector<int> v; pair<int,int> p=*it; num=p.first; while(num>1) { if(num%2==0) { num=num/2; v.push_back(num); } else { num=(num*3+1)/2; v.push_back(num); } } mkey[p.first]=1; m.erase(p.first); for(int i=0;i<v.size();i++) { if(mkey[v[i]]==1) mkey.erase(v[i]); } for(int i=0;i<v.size();i++) { m.erase(v[i]); } } int temp=0 ; for(auto it1=mkey.rbegin();it1!=mkey.rend();it1++) { pair<int,int> p=*it1; if(p.second==1) { if(temp==1) cout<<" "; cout<<p.first; temp=1; } } return 0; }
踩坑:
- 在map容器中,如果一個元素對原來不存在,只要使用了m[key],那麼這個元素就存在容器中了,只不過值為預設值,比如map<int,int> m,則值預設為0。