PAT --- 1005. 继续(3n+1)猜想 (25)

来源:互联网 发布:mysql数据库常用语句 编辑:程序博客网 时间:2024/05/16 12:30

1005. 继续(3n+1)猜想 (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对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个空格隔开,但一行中最后一个数字后没有空格。

输入样例:
63 5 6 7 8 11
输出样例:
7 6


注:这个题搞了两次也没搞好,有点难受,最后借鉴网友的一份得以通过。

网友代码:

#include <iostream>  #include <vector>  #include <set>  #include <algorithm>  #include <functional>    using namespace std;    void get_overlap_number(set<int>& st, int n)      //获取数列中被覆盖的数  {      while ( n != 1 )      {          n = (n & 1) ? (3 * n + 1) >> 1 : n >> 1;          if ( st.find( n ) == st.end() )             //不在集合中,被覆盖数放入集合          {              st.insert( n );          }          else                                        //在集合,直接跳出循环,无需再找              break;      }  }    int main()  {      int n;      cin>>n;      vector<int> v;      set<int> st;      for ( int i=0; i<n; i++ )      {          int t;          cin>>t;          v.push_back( t );          get_overlap_number(st, t);      }      vector<int> ans;      for (int i=0; i<v.size(); i++)      {          if ( st.find(v[i]) == st.end() )        //遍历集合,若不在集合中,则是关键数          {              ans.push_back( v[i] );          }      }      sort(ans.begin(), ans.end(), greater<int>() );        //排序,大到小      for (int i=0; i<ans.size()-1; i++)      {          cout<<ans[i]<<" ";      }      cout<<ans[ans.size()-1];      return 0;  }  

附上我的代码(有三个测试点不过):

#include <iostream>#include <set>#include <string>#include <vector>#include <algorithm>using namespace std;void DealNum(set<int> &numSet,int &n){while(n != 1){if(n % 2 == 0)             //是偶数n /= 2;elsen = (3*n + 1)/2;numSet.insert(n);          //每次执行结果放入numSet}}int main(){int i;    set<int> numSet;    //用来记录每次dealnum的值vector<int> mArray;  //存放输入的数vector<int> maxSet;  //储存不能覆盖的数cin>> i;for (int n = 0; n < i; n++)                 //获取界面数字{int x;cin>> x;mArray.push_back(x);}DealNum(numSet, mArray[0]);                        //首先把第一个数字进行处理for (int n = 1; n < mArray.size(); n++){if((numSet.find(mArray[n])) != numSet.end()) ;     //在numSet中找到这个数,不作处理else{maxSet.push_back(mArray[n]);                     //numSet中没有此数,将其插入到maxSet中DealNum(numSet, mArray[n]);                   //然后进行处理}}sort(maxSet.begin(), maxSet.end(), greater<int>() );        //排序,大到小  for(int i = 0; i < maxSet.size() - 1 ; ++i){     cout<<maxSet[i]<<" ";}cout<< maxSet[maxSet.size() - 1];return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发新长的绒毛怎么办 久躺床上头发黏在一起怎么办 头发长油怎么办小妙招 头发出油多脱发怎么办 头发出油掉头发怎么办 在英国狂掉头发怎么办 我头发油头皮痒脱发怎么办 油性头发容易掉发怎么办 洗了头发很蓬松怎么办 小孩头皮黄掉头发怎么办 头发又油又掉发怎么办 英国的水掉头发怎么办 洗发为什么会掉头发怎么办 头发老掉怎么办吃什么 19岁掉头发严重怎么办 头发总是从根掉怎么办 18岁掉头发很厉害怎么办 20岁脱发严重该怎么办 22岁m型脱发严重怎么办 22掉头发很厉害怎么办 哺乳期头发掉的很厉害怎么办 失眠多梦掉头发怎么办 老婆生完孩子掉头发怎么办 16岁发际线高怎么办 生了小孩头发掉怎么办 16岁头发掉的厉害怎么办 经常脱发严重不长头发怎么办 产后3年一直脱发怎么办 生完宝宝头发掉怎么办 生完小孩掉好多头发怎么办 脱发头发掉的厉害怎么办 宝宝四个月妈妈掉头发怎么办 产后四个月掉头发怎么办 洗头时严重掉发怎么办 头发老是掉得到处都是怎么办 短发洗完头头发向外外怎么办 20岁掉头发厉害怎么办 20岁老掉头发怎么办 20岁有点掉头发怎么办 20岁开始掉头发怎么办 20岁掉头发严重怎么办