2007NOIP普及组真题 4. Hanoi双塔问题

线上OJ:

【07NOIP普及组】Hanoi双塔问题

题解分析

1、本题考的其实不是Hanoi塔,而是瞪眼法(数学推导)和高精度
2、本题不需要输出移动的顺序,只是输出移动的次数即可。

在这里插入图片描述

核心思想:

1、从上述图中,我们可以推导出: f [ i + 1 ] = 2 ∗ f [ i ] + 1 f[i+1] = 2 * f[i] + 1 f[i+1]=2f[i]+1;
2、由于本题是双塔,每个圆盘有两个,所以Step2的第 i+1 个要移动两次,即 f [ i + 1 ] = 2 ∗ f [ i ] + 2 f[i+1] = 2 * f[i] + 2 f[i+1]=2f[i]+2
3、由 ① 式已经可以直接写代码完成。但我们仍可继续简化公式。
4、根据 ① 式,我们可推出 f[1] = 2, f[2] = 6, f[3] = 14, f[4] = 30。 即 f [ n ] = 2 n + 1 − 2 f[n] = 2^{n+1} - 2 f[n]=2n+12
5、所以,我们只要根据 n ,直接输出 ② 式的结果即可。(以上为瞪眼法推导结果,至此写出的代码,可拿25分)
6、但本题的 n 会取到200, 2 200 2^{200} 2200 非常大,预计数字会达到60位~70位( 2 10 = 1024 ≈ 1 0 3 2^{10} = 1024 ≈ 10^3 210=1024103)。所以剩下的75分需要用高精度
7、高精度的计算方法 可根据下图推导:

在这里插入图片描述

a. 用字符数组 s[] 来存储计算结果的每一位,个位在s[99],十位在s[98],百位在s[97]
b. 用 len 来存储计算结果的位数
c. 计算时考虑进位

解法一、高精度
#include <bits/stdc++.h>
using namespace std;int n, len = 1; // len表示结果的位数,比如结果是30(就是2位),比如结果是126(就是3位)。先初始化结果位数为1
char s[100];   // 用字符数组来存储结果每一位,比如结果是30,则s[98]='3',s[99]='0'; 比如结果是126,则s[97]='1',s[98]='2',s[99]='6';// 首先:已知 待输出的结果 = 2^(n+1) - 2
// 利用字符数组的乘法计算 2^(n+1)
// 最后一位 s[99]的ascii字符-2。因为2^n末位只有2,4,6,8,所以此处 -2 不需要考虑向前借位,直接减即可)
int main()
{cin >> n;s[99] = '2'; // 将数组的最后一个元素初始化为'2',表示n为1时的输出// 计算 2^(n+1)for(int i = 2; i <= n+1; i++){int a = 0; // 存储*2后的结果,比如2*8=16,则a=16int c = 0; // 存储进位的数字,比如2*8=16,则c=1int j;  // j定义在for循环外,多一位进位时可直接赋值// 把当前结果从个位开始*2 for(j = 99; j > 99 - len; j--)  // s[99] 存储的是个位数,s[98]存储的是十位,s[97]存储的是百位...{a = (s[j] - '0') * 2 + c;s[j] = a % 10 + '0';  // *2后的个位存回原处c = a / 10; // *2后的进位存放于c,下一轮用}if (c != 0) // 如果退出循环时,还有进位,说明 len 要增加。(比如64*2=128,结果的位数从2变为3){s[j] = c + '0';len++;  // 进位之后,数字的位数要+1}}s[99] -= 2; // 最后一位ascii字符-2(此处减法不需要考虑借位,因为2^n末位只有2,4,6,8,都足以减去2)// 输出结果,如果结果是30,则len是2,输出s[98]='3',s[99]='0'。如果结果是126,则len是3,输出s[97]='1',s[98]='2',s[99]='6'for(int i = 100 - len; i < 100 ; i++)  cout << s[i];return 0;
}
解法二、利用 streamstring 流

首先:已知 待输出的结果 = 2^(n+1) - 2
我们利用stringstream对象的自动类型转换,它的内部有一个string的流对象缓冲区
输入时( s << ):自动识别右边输入的变量类型并 自动 转换为string
输出时( s >> ):自动识别右边输出的变量类型并 自动 转换后赋值

#include <bits/stdc++.h>
using namespace std;int n;
stringstream s;
string a;int main()
{cin >> n;// 先利用 stringstream 的特性,把超常的计算结果缓冲到 string 流对象缓冲区s << fixed << setprecision(0) << pow(2, n+1);  // fixed + setprecision(0) 表示小数点后为0位s >> a;  // 再利用 stringstream 的特性,把 string 流对象缓冲区的内容输出到 string aa[a.size()-1] -= 2;   // 最后一位ascii字符-2(此处减法不需要考虑借位,因为2^n末位只有2,4,6,8,都足以减去2)  cout << a;cout << a << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见算法(3)

1.Arrays 它是一个工具类&#xff0c;主要掌握的其中一个方法是srot&#xff08;数组&#xff0c;排序规则&#xff09;。 o1-o2是升序排列&#xff0c;o2-o1是降序排列。 package test02; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparat…

PostgreSQL用户与角色简述

简述 PostgreSQL通过角色&#xff08;role&#xff09;来控制数据库的访问权限。角色可以拥有数据库对象&#xff08;比如表、函数等&#xff09;&#xff0c;并允许将这些对象的权限授予其他角色&#xff0c;从而实现对象访问的控制。角色&#xff08;role&#xff09;包含了…

虹科Pico汽车示波器 | 免拆诊断案例 | 2012 款雪佛兰科鲁兹车偶尔多个故障灯异常点亮

故障现象 一辆2012款雪佛兰科鲁兹车&#xff0c;搭载1.8 L 发动机&#xff0c;累计行驶里程约为9.6万km。该车组合仪表上的发动机故障灯、ABS故障灯及动力转向故障灯偶尔异常点亮&#xff0c;同时发动机转速表和发动机冷却液温度表的指针会突然归零&#xff0c;严重时发动机无…

独享IP是原生IP吗?二者有何区别?

原生IP&#xff1a; 原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中…

牛客NC367 第K个n的排列【困难 dfs,全排列问题 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1595969179464e4c940a90b36abb3c54 思路 全排列问题本文提供的答案在力扣同一道题60. 排列序列&#xff0c;超时了但是截止文章发表日&#xff0c;牛客上是能通过全部测试用例的Java代码 import java.util.*;pu…

Redis - 优惠卷秒杀

场景分析 为了避免对数据库造成压力&#xff0c;我们在新增优惠卷的时候&#xff0c;可以将优惠卷的信息储存在Redis中&#xff0c;这样用户抢购的时候访问优惠卷信息&#xff0c;通过Redis读取信息。 抢购流程&#xff1a; 业务分析 既然在新增优惠卷的时候&#xff0c;我…

【c语言】了解指针,爱上指针(5)

了解指针&#xff0c;爱上指针&#xff08;5&#xff09; 回调函数qsort函数冒泡排序模拟实现qsort函数 回调函数 回调函数&#xff1a;就是一个通过函数指针调用的函数。 把函数的指针作为参数传给另一个函数&#xff0c;当这个指针被用来调用指向的函数时&#xff0c;此时被…

驱动编译报error: negative width in bit-field ‘<anonymous>’错误

错误如下图所示&#xff1a; 代码如下&#xff1a; 问题点&#xff1a;module_param的其他用户的权限参数上。 在Linux中&#xff0c;文件权限由读(r)、写(w)、执行(x)权限组成&#xff0c;分别对应数值4、2、1。 第一位0是占位符&#xff0c;在这里没有意义&#xff0c;因为…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具&#xff0c;该工具专为蓝队研究人员设计&#xff0c;可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…

java图书电子商务网站的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书电子商务网站的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 图书电子商…

基于附带Attention机制的seq2seq模型架构实现英译法的案例

模型架构 先上图 我们这里选用GRU来实现该任务&#xff0c;因此上图的十个方框框都是GRU块&#xff0c;如第二张图&#xff0c;放第一张图主要是强调编码器的输出是作用在解码器每一次输入的观点&#xff0c;具体的详细流程图将在代码实现部分给出。 编码阶段 1. 准备工作…

【C++进阶】AVL树

0.前言 前面我们已经学习过二叉搜索树了&#xff0c;但如果我们是用二叉搜索树来封装map和set等关联式容器是有缺陷的&#xff0c;很可能会退化为单分支的情况&#xff0c;那样效率就极低了&#xff0c;那么有没有方法来弥补二叉搜索树的缺陷呢&#xff1f; 那么AVL树就出现了&…

6.小程序页面布局 - 账单明细

文章目录 1. 6.小程序页面布局 - 账单明细1.1. 竞品1.2. 布局分析1.3. 布局demo1.4. 页面实现-头部1.5. 账单明细1.5.1. 账单明细-竞品分析1.5.2. 账单明细-实现1.5.2.1. 账单明细-实现-mock数据1.5.2.2. 每日收支数据的聚合整理1.5.2.3. 页面scroll-view 1.6. TODO 1. 6.小程序…

java —— 封装、继承、接口和多态

一、封装 封装是将数据和操作这些数据的方法整合成一个类。在这个类中&#xff0c;用 private 修饰符将某些数据隐藏起来&#xff0c;只通过特定的方法实现这些数据的访问和修改&#xff0c;以此实现数据的完整和安全性。 封装的步骤&#xff1a; 二、继承 继承是指把子类共有…

Meta发布Chameleon模型预览,挑战多模态AI前沿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【数据结构与算法】之堆的应用——堆排序及Top_K问题!

目录 1、堆排序 2、Top_K问题 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、堆排序 对一个无序的数组…

03_前端三大件CSS

文章目录 CSS用于页面元素美化1.CSS引入1.1style方式1.2写入head中&#xff0c;通过写style然后进行标签选择器加载样式1.3外部样式表 2.CSS样式选择器2.1 元素选择器2.2 id选择器2.3 class选择器 3.CSS布局相关3.1 CSS浮动背景&#xff1a;先设计一些盒子因此&#xff0c;引出…

[图解]产品经理创新模式02改善信息流转

1 00:00:02,160 --> 00:00:04,000 第二种改进模式 2 00:00:04,010 --> 00:00:06,340 就是改善信息流转 3 00:00:06,550 --> 00:00:08,000 它是这样的 4 00:00:09,250 --> 00:00:11,290 当电脑系统越来越多的时候 5 00:00:11,300 --> 00:00:12,530 就会出现这…

linux centos stream 9 定时任务

定时任务,也称为计划任务,指在规定时间执行某项任务。在各操作系统中都有此功能,如Windows下的计划任务:定时关机等。 linux用户定时任务和系统定时任务是在Linux操作系统中用于自动执行特定任务的机制。它们基于cron(cron daemon)服务来完成的。 cron是linux系统中以后台…

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …