Project_Euler-14 题解

Project_Euler-14 题解

标题

题目

1
2

思路

从暴力枚举出发,枚举100万以内的所有数字,对于每一个数,维护一个长度,每根据公式执行一次运算就加一。

最后取最大值。

暴力枚举代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define ll long long
#define MAX_N 1000000

ll get_lens(ll n) {
    ll ans = 1;
    while(n != 1) {
        if (n % 2 == 0) {
            n /= 2;
        } else {
            n = 3 * n + 1;
        }
        ans++;
    }
    return ans;
}

int main(int argc, int *argv[]) {
    ll n = MAX_N, ans = 0, num;
    for(ll i = 1; i <= n; i++) {
        ll len = get_lens(i);
        if (len < ans) continue;
        ans = len;
        num = i;
    }
    printf("ans = %lld, num = %lld\n", ans, num);
    return 0;
}

优化思路

观察下面的例子:

i = 8 i = 8 i=8 时:

8 → 4 → 2 → 1 8\to4\to2\to1 8421

i = 32 i = 32 i=32 时:

32 → 16 → 8 → 4 → 2 → 1 32\to16\to\textcolor {red}{8\to4\to2\to1} 32168421

我们发现后半部分是重复计算的,因此可以在此进行优化。

可以使用记忆化,维护一个数组,在计算 i i i 的时候,将其变换的项数记录下来,如果遇到之前计算过的,直接加上这个项数。

例如,我们维护一个数组keep,计算 8 8 8 时,发现有 4 4 4 项,因此可以让a[8] = 4
当计算 32 32 32 时,运算到 8 8 8 的时候,直接 2 + 4 = 6 2 + 4 = 6 2+4=6 得出结果。

记忆化代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define ll long long
#define MAX_N 1000000

ll keep[MAX_N + 5]; 

ll get_lens(ll n) {
    ll ans = 1, firn = n;
    while(n != 1) {
        if (n & 1) {
            n = 3 * n + 1;
        } else {
            n /= 2;
        }
        if (n < MAX_N && keep[n]) {
            keep[firn] = keep[n] + ans;
            return keep[n] + ans;
        }
        ans++;
    }
    keep[firn] = ans;
    return ans;
}

int main() {
    ll n = MAX_N, ans = 0, num;
    for(ll i = 1; i <= n; i++) {
        ll len = get_lens(i);
        if (len < ans) continue;
        ans = len;
        num = i;
    }
    printf("ans = %lld, num = %lld\n", ans, num);
    return 0;
}

优化比较

暴力代码:
11

记忆化代码:
22
快了 17 + 17+ 17+ 倍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跳格子3 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小明和朋友们一起玩跳格子游戏&#xff0c;每个格子上有特定的分数&#xff0c;score[] [1 -1 -6 7 -17 7]&#xff0c; 从起点score[0]开始&#xff0c;每次最…

petalinux_zynq7 驱动DAC以及ADC模块之四:python实现http_api

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

MongoDB学习笔记

1. 写在前面 最近工作用到了Mongodb&#xff0c;虽然有了gpt&#xff0c;对于这种数据库操作的代码基本上不用自己费多大功夫&#xff0c;但对于知识本身&#xff0c;还是想借机会系统学习下Mongodb的&#xff0c;原因是之前接触数据库一直都是mysql&#xff0c;oracle等关系型…

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

Linux java查看内存消耗 linux查看java程序内存(转载)

Linux java查看内存消耗 linux查看java程序内存 目录 一、jps命令。 二、ps命令。 三、top命令。 四、free命令。 五、df命令。 查看应用的CPU、内存使用情况&#xff0c;使用jps、ps、top、free、df命令查看。 一、jps命令。 可以列出本机所有java应用程序的进程pid。…

浏览器显示「SSL 证书无效」应该如何解决?

作为保护网站传输数据安全的重要工具&#xff0c;SSL证书经常被部署于网站服务器上以实现HTTPS加密。但部分网站部署SSL证书后&#xff0c;访问时有时候会出现SSL 证书无效警示。那么SSL证书无效怎么办&#xff1f;导致SSL证书无效的情况可能是SSL证书本身的原因&#xff0c;也…

轻松掌握opencv的8种图像变换

文章目录 opencv的8种图像变换1. 图像放大、缩小2. 图像平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 图像的位运算&#xff08;AND, OR, XOR&#xff09;7. 图像的分离和融合8. 图像的颜色空间 opencv的8种图像变换 1. 图像放大、缩小 我们先看下原图 import cv2 import ma…

【论文精读】IBOT

摘要 掩码语言建模(MLM)是一种流行的语言模型预训练范式&#xff0c;在nlp领域取得了巨大的成功。然而&#xff0c;它对视觉Transformer (ViT)的潜力尚未得到充分开发。为在视觉领域延续MLM的成功&#xff0c;故而探索掩码图像建模(MIM)&#xff0c;以训练更好的视觉transforme…

mysql 自定义函数create function

方便后续查询&#xff0c;做以下记录&#xff1b; 自定义函数是一种与存储过程十分相似的过程式数据库对象&#xff0c; 它与存储过程一样&#xff0c;都是由 SQL 语句和过程式语句组成的代码片段&#xff0c;并且可以被应用程序和其他 SQL 语句调用。 自定义函数与存储过程之间…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

无法打开源文件 “csignal“ (dependency of “rclcpp/rclcpp.hpp“).等错误解决方法

#include "rclcpp/rclcpp.hpp"无法打开源文件的问题 报错情况解决流程1、ctrlshiftp2、修改编辑配置3、结果 在进行ros2编程的过程中&#xff0c;出现上述错误&#xff0c;网上没有找到解决方法&#xff0c;为后来者记录下解决经验&#xff0c;少走弯路&#xff0c;节…

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

基于springboot+vue的植物健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

信号滤波在PID闭环控制中的作用(对比测试实验)

信号滤波在工业中的应用不用多说&#xff0c;这篇博客我们通过PID仿真测试实验&#xff0c;对比分析信号滤波在PID闭环控制中的作用。我们实验里需要用到的PLC算法模块大家可以查看下面文章链接&#xff1a; 1、博途PLC 信号发生器模块 https://rxxw-control.blog.csdn.net/a…

制造业客户数据安全解决方案(数据防泄密需求分析)

机械行业是历史悠久的工业形式&#xff0c;与国民经济密切相关&#xff0c;属于周期性行业&#xff0c;是我国最重要的工业制造行业之一。即使网络经济与IT信息技术在世界范围内占据主导地位&#xff0c;依然离不开一个发达的、先进的物质基础&#xff0c;而机械行业正是为生成…

CSS实现半边边框(只有边框的部分可见)

CSS实现半边边框&#xff08;只有边框的部分可见&#xff09; <div class"part box"><h1>内容</h1><!-- 绘出下面两个对角边框--><div class"part-footer"></div> </div>主要代码 .box {width: 100px;height:…

leetcode hot100打家劫舍三

本题是打家劫舍的变形&#xff0c;数据结构是树形。涉及到树的题目一定要想清楚树的遍历顺序&#xff08;前中后序&#xff09;。之后再考虑利用动态规划来解决。 动态规划是一直记录状态&#xff0c;我们可以根据动态规划的数组来记录变化的状态&#xff0c;最终求的自己想要…

Surely Vue Table表格css、js方法去除水印

文章目录 Surely Vue Table表格css、js方法去除水印用法 css 去除js去除 Surely Vue Table表格css、js方法去除水印 "surely-vue/table": "^4.2.7","ant-design-vue": "^2.1.2",用法 在main.ts文件中全局引入 import STable from su…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

VSCode-更改系统默认路径

修改vscode中的默认扩展路径&#xff1a;"%USERPROFILE%\.vscode" 打开目录C:\用户\电脑用户名&#xff0c;将.vscode文件剪切至D:\VSCode文件夹下 用管理员身份打开cmd.exe命令界面输入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…