1005 继续(3n+1)猜想

一、题目

卡拉兹(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 个空格隔开,但一行中最后一个数字后没有空格。

三、样例

输入样例

6
3 5 6 7 8 11

输出样例

7 6

四、题目分析

运用哈希散列的思想将输入的数值作为数组下标,设置两个数组num[101],cover[101](全局变量初始化为false)。
num数组下标的数值如果被读入,且未被之前读入的值覆盖,数值为1;
cover数组下标未被覆盖则数值为0,已被覆盖则数值为1。
最后逆向遍历数组,输出满足要求的数组下标。

五、代码

#include <bits/stdc++.h>
using namespace std;
bool num[101];   //标志数组,下标的数值如果被读入,且未被之前读入的值覆盖,数值为1
bool cover[101]; //标志数组,下标未被覆盖则数值为0,已被覆盖则数值为1
int main()
{int n;cin >> n;int m;for (int i = 0; i < n; i++){cin >> m;if (cover[m])continue;  //如果m已被覆盖,可以跳过num[m] = true; //m是有效数据,标志数组置为truewhile (m != 1){/*3n+1变换*/if (m % 2)m = (3 * m + 1) / 2;elsem = m / 2;/*标记覆盖*/if (m <= 100)//防止溢出if (cover[m])break;//已经被覆盖可以跳出循环elsecover[m] = true;}}int flag = 0;for (int i = 100; i >= 2; i--)//从大到小输出{if (num[i] && !cover[i])//数组下标满足未被覆盖且是输入数值{if (flag)//控制格式cout << ' ';flag = 1;cout << i;}}return 0;
}

六、总结

  • 将数组定义为全局变量,可以被自动被初始化为0.
  • 当题目给定数值范围时,可以考虑哈希存储数据.

PAT (Basic Level) Practice1005 继续(3n+1)猜想相关推荐

  1. PAT (Basic Level) Practise - 继续(3n+1)猜想

    题目链接:https://www.patest.cn/submissions/4414905 1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限 ...

  2. 1001 害死人不偿命的(3n+1)猜想 (15分) PAT (Basic Level) Practice (中文)C语言版

    PAT (Basic Level) Practice (中文) 1001 害死人不偿命的(3n+1)猜想 (15分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一 ...

  3. 卡拉兹(Callatz)猜想,PAT(Basic Level) Practise NO.1001

    PAT(Basic Level) Practise NO.1001 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半. 这样 ...

  4. 【题解】PAT (Basic Level) Practice (中文)

    互联网行业的小白,写博客的目的是为了记录自己的学习过程.对自己学习中所犯的错误做一个总结.由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教! PAT Basic Level P ...

  5. PAT basic level 答案+解题思路+难点 (个人刷题记录)

    PAT basic level 使用语言:C++ 仅记录一下自己刷题过程的心得体会 永远保持更新(期待更好的解法) 可能有些题没有(那就是我还没做出来,以后会更的!) 欢迎大家与我讨论交流√ 题目序列 ...

  6. PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)

    PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)   http://www.patest.cn/contests/pat-b-practise/1025 ...

  7. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...

  8. 可优化-PAT (Basic Level) Practice Python解法 1026 程序运行时间(时间进位/四舍五入Tobe解决)

    可优化-PAT (Basic Level) Practice Python解法 1026 程序运行时间(时间进位/四舍五入Tobe解决) c1, c2 = map(int,input().split( ...

  9. PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分)

    PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即T代表顶级:A代表甲级:B代表乙级: 第 ...

最新文章

  1. 消息队列系列(三):.Rabbitmq Trace的使用
  2. 【codevs1565】【BZOJ2242】计算器,数论练习
  3. 禁用select下拉方法
  4. iPhone 11 引领芯片新革命?
  5. SpringMvc+Mybatis +Oracle
  6. Security+ 学习笔记29 虚拟化
  7. vue v-if 和 v-show 的知识点
  8. node查询数据库 服务器报错_MySql数据库在NodeJS中简单的基本操作
  9. excel文件下载下来损坏 js_js实现txt/excel文件下载
  10. 运放输入偏置电流方向_运放-输入偏置电流与输入失调电流
  11. 域名Whois信息查询接口
  12. 南京信息工程大学计算机考研怎么样,南京信息工程大学就业怎么样,考研好不好?...
  13. JavaScript完成知乎页面
  14. 7-1 查找书籍 (20 分)给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。输入格式:输入第一行给出正整数n(<10),随后给出n本书的信息
  15. PanDownload作者被抓,为何大家都对百度网盘如此气愤?
  16. LTE学习:PHICH
  17. java输入数字金额输出汉字大写_JS-输入数字输出大写中文
  18. python 有没有 hold on的用法
  19. android 输入日语 外键盘,日语外来语怎么用键盘输入
  20. Model Compression and Hardware Acceleration for Neural Networks A Comprehensive Survey

热门文章

  1. linux学习笔记:磁盘格式化与磁盘检验命令
  2. 怎么单选_第一届化妆品分类大赛丨用过的化妆刷、过期的口红…该怎么扔
  3. ERROR 1130 (HY000): Host ‘192.168.3.238‘ is not allowed to connect to this MySQL server
  4. 喜欢熬夜的人注意!出现3大迹象时,说明身体极度危险!
  5. tcl 查询与设置编码格式
  6. eltable 无数据文案修改_el-table的二次封装详细版(一)
  7. android顶部标题app_name,如何写一个app通用的title
  8. java 获取当前年_java中的反射(三) - kelexin
  9. qt及qt quick开发实战精解_Qt5实战001:Qt 5.15下载安装详解
  10. ge linux安装apt_教你如何在 Linux 中使用 apt 命令