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

news2024/11/15 11:31:28
线上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=16
        int c = 0; // 存储进位的数字,比如2*8=16,则c=1
        int 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 a
    a[a.size()-1] -= 2;   // 最后一位ascii字符-2(此处减法不需要考虑借位,因为2^n末位只有2,4,6,8,都足以减去2)  cout << a;

    cout << a << endl;
    return 0;
}

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

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

相关文章

.NET 某和OA办公系统全局绕过漏洞分析

转自先知社区 作者&#xff1a;dot.Net安全矩阵 原文链接&#xff1a;.NET 某和OA办公系统全局绕过漏洞分析 - 先知社区 0x01 前言 某和OA协同办公管理系统C6软件共有20多个应用模块&#xff0c;160多个应用子模块&#xff0c;从功能型的协同办公平台上升到管理型协同管理平…

Next-Admin,一款基于Nextjs开发的开箱即用的中后台管理系统(全剧终)

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续分享一下最近开源的 Next-Admin 项目的最新更新。 这次更新是1.0版本最后一次更新&#xff0c;也根据用户反馈的问题做了一些优化&am…

uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例

随着多端小程序研发工具的日益普及&#xff0c;诸如uniapp、Taro、Flutter等跨平台解决方案使得开发者能够高效地构建同时适配多个主流小程序平台&#xff08;如微信、支付宝、百度、字节跳动等&#xff09;的应用。尽管各平台间存在一定的差异性&#xff0c;但在获取用户手机号…

helm离线安装

目录 概述实践 概述 centos 7.x 离线安装 helm 3.14.4 版本 实践 离线包资源下载地址 github [roothadoop01 ~]# tar -xvf helm-v3.14.4-linux-amd64.tar.gz linux-amd64/ linux-amd64/README.md linux-amd64/LICENSE linux-amd64/helm [roothadoop01 ~]# mv ./linux-amd…

【云原生 | 59】Docker中通过docker-compose部署ELK

目录 1、组件介绍 2 、项目环境 2.1 各个环境版本 2.2 Docker-Compose变量配置 2.3 Docker-Compose服务配置 3、在Services中声明了四个服务 3.1 ElasticSearch服务 3.2 Logstash服务 3.3 Kibana服务 3.4 Filebeat服务 4、使用方法 4.1 方法一 4.2 方法二 5、启动…

WebPack插件实现:打包之后自动混淆加密JS文件

在WebPack中调用JShaman&#xff0c;实现对编译打包生成的JS文件混淆加密 一、插件实现 1、插件JShamanObfuscatorPlugin.js&#xff0c;代码&#xff1a; class JShamanObfuscatorPlugin { apply(compiler) { compiler.hooks.emit.tapAsync(JShamanObfuscatorPlugin, (comp…

深度神经网络——什么是迁移学习?

1.概述 在练习机器学习时&#xff0c;训练模型可能需要很长时间。从头开始创建模型架构、训练模型&#xff0c;然后调整模型需要大量的时间和精力。训练机器学习模型的一种更有效的方法是使用已经定义的架构&#xff0c;可能具有已经计算出的权重。这是背后的主要思想 迁移学习…

嵌入式进阶——OLED显示器(SPI)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 SPI协议原理图字库芯片中文显示屏原理API的使用 SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行…

使用Django实现WebSocket

文章目录 安装依赖编写Consumer配置路由在模板中使用WebSocket运行应用 WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;在Web开发中被广泛应用于实时通信和数据推送。本文将介绍如何在Django中使用WebSocket来实现实时通信功能。 安装依赖 首先&#xff0…

VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台 ESXi 8.0U2 & vCenter Server 8.0U2 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u2/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org …

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 有些网站为了节省流量和资源&#xff0c;提高加载效率&#xff0c;采用的是动态加载&#xff08;懒加载&#xff09;的&#xff0c;也就是当拖动页面右侧滚动条后会自动加载网…

IDM究竟有哪些优势:全面解析高速下载与管理利器!

一、引言 Internet Download Manager&#xff08;简称IDM&#xff09;是一款功能强大的文件下载工具&#xff0c;它具备许多优势&#xff0c;使得用户在下载文件时能够获得更快的速度和更好的体验。本文将详细介绍IDM的优势。 二、IDM简介 IDM是一款流行的下载管理软件&#…

绘唐app官方版绘唐3AI工具

绘唐app官方版绘唐3AI工具 激活授权方式&#xff1a;https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 绘唐app是一款基于人工智能和摄影技术的应用程序&#xff0c;旨在帮助用户将照片转化为唐朝画风的艺术作品。 该应用程序使用先进的图像处理算法&#xf…

Epic Pen Pro v3 解锁版安装教程 (屏幕实时标记注释工具)

前言 Epic Pen是一款功能强大的屏幕标记工具&#xff0c;允许您在屏幕上绘图或书写&#xff0c;而无需在后台与软件交互。这意味着您几乎可以注释任何东西&#xff01;使用我们流行的屏幕标记和Windows数字白板工具Epic Pen编写、绘制和突出显示&#xff0c;包括演示文稿软件&…

深入解析绘图范式:面向对象与直接操作的较量

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 第一节&#xff1a;面向对象绘图的魅力 第二节&#xff1a;直接操作绘图模块的便捷性 第三…

Linux查看设备信息命令

dmidecode | grep Product Name 查看grub版本号&#xff1a;rpm -qa | grep -i "grub" 客户端操作系统版本&#xff1a; cat /etc/issue cat /etc/redhat-release 处理器品牌及型号&#xff1a; less /proc/cpuinfo |grep model

基于BP神经网络的64QAM解调算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................... % 第一部分&#xff1a;加载并可视…

触觉训练技巧:盲人感知世界的第二双“眼”

在当今科技日新月异的时代&#xff0c;辅助技术正逐步成为残障人士融入社会的重要桥梁。其中&#xff0c;一款名为““蝙蝠避障””的创新软件&#xff0c;凭借其实时避障和拍照识别功能&#xff0c;为盲人朋友的日常生活带来了前所未有的便捷与安全。然而&#xff0c;技术的辅…

社区电商系统业务架构:打造线上线下融合的智慧生活圈

在数字化时代&#xff0c;社区电商系统已成为连接线上线下的重要纽带&#xff0c;为居民提供便捷的购物体验和多样化的生活服务。本文将深入探讨社区电商系统的业务架构&#xff0c;揭示其在构建智慧生活圈中的关键作用。 ### 1. 概述 社区电商系统是基于互联网技术构建的一种…

【iOS】UI学习(一)

UI学习&#xff08;一&#xff09; UILabelUIButtonUIButton事件 UIViewUIView对象的隐藏UIView的层级关系 UIWindowUIViewController定时器与视图对象 UISwitch UILabel UILabel是一种可以显示在屏幕上&#xff0c;显示文字的一种UI。 下面使用代码来演示UILabel的功能&#…