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;}
阅读全文
0 0
- PAT 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- pat 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- PAT 1005. 继续(3n+1)猜想
- PAT Basic Level 1005. 继续(3n+1)猜想 (25)
- PAT 1005. 继续(3n+1)猜想 (25)
- PAT - 1005. 继续(3n+1)猜想 (25)
- 编程题目:PAT 1005. 继续(3n+1)猜想 (25)
- PAT 1005. 继续(3n+1)猜想 (25)
- PAT(B)1005. 继续(3n+1)猜想 (25)
- pat 水 1005. 继续(3n+1)猜想 (25)
- PAT 1005. 继续(3n+1)猜想 (25) ;JAVA实现
- PAT 1005. 继续(3n+1)猜想 (25)
- PAT乙级 1005.继续(3n+1)猜想 (25)
- C++11 Future
- FZOJ 2233
- 2017 Multi-University Training Contest
- AIDL的使用情况和实例介绍
- 阶 和 原根
- PAT --- 1005. 继续(3n+1)猜想 (25)
- 常用 Git 命令清单
- MySQL系列—Replication基本原理
- python多线程爬虫学习--去除字符串中间空格
- mysql之常用指令语句
- Error mounting /dev/sda1 at /media/XXXX: Command-line `mount -t "ntfs" -o
- 使用加密工具类进行有效的字符串加密——CSDN博客
- 如何解决Mysql中中文乱码的问题
- 冒泡排序算法之JAVA实现