金币程序题
昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间,把编程思路记录下来。第一个方案采样通用的方法,循环处理,但这样的程序时间复杂度与输入的值成正比,然后我又想了第二种方案,采用算式计算的方法,时间复杂度与输入无关。以下是我的分析思路:
国王将金币作为工资,发放给忠诚的骑士。
第一天骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四,五,六天),每天收到三枚金币;之后四天,每天收到四枚金币,依次类推;这种工资发放模式会一直延续下去,当连续N天收到N枚金币后,骑士会在之后的N+1天,每天收到N+1枚金币。【白名单竞赛NOC】
请编写程序计算前M天里,骑士一共获得了多少金币。
【输入格式】输入包含一个正整数M,表示发放金币的天数。
【输出格式】输出一个正整数,即骑士收到的金币数。
【输入样例】
6
【输出样例】
14
分析:
天数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ......
金币数: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 ......
总数: 1 3 5 8 11 14 18 22 26 30 35 40 45 50 55 ......
可以知道:
第1天收到1枚金币,第二三天每天收到2枚金币,第四五六天每天收到3枚金币,第七八九十天每天收到4枚金币,按这个规律一直持续下去;
每天发放金币的数量的增长规律是:1,2,3,4,5,6,。。。即1枚金币发放1天,2枚金币发放2天,3枚金币发放3天。。。N枚金币发放N天;
所以发放的金币总数量: (假设N枚金币刚好连续发放了N天)
total = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + ... + N * N
题目需求是:用户输入天数M,输出发放的总的金币数;
所以首先我们要根据天数M,计算出当天发放的金币数N。
我们从上述表格中可以看出:在第1,3,6,10,15,。。。天的时候,当天发放的金币数量是1,2,3,4,5,。。。;并且1枚金币发了1天,2枚金币发了2天,。。。5枚金币刚好发了5天;
所以,我们首先假设用户刚好输入的是1,3,6,10,15,。。。这些天数,然后我们根据这些天数来计算当天应该发放的金币数N;
现在开始找规律:当M=1时:N=1;
当M=3时:M=1+2; N=2;
当M=6时:M=1+2+3; N=3;
当M=10时:M=1+2+3+4; N=4;
当M=15时:M=1+2+3+4+5; N=5;
......
从上述规律可以看出M的值为:M = 1 + 2 + 3 + 4 + 5 + ... + N
这样我们可以使用循环来进行计数累加,当累加值大于等于M时,循环终止,此时计数值即为N。
最后考虑到用户输入的值会小于累加值,在计算总金币数的时候要减掉(M-用户输入)*N的数量。
程序如下:
M = int( input( “请输入一个正整数:” ) )
num = 0
total = 0
for N in range( 1,M ) :
num = num + N
total = total + N * N
if num >= M :
total = total - ( num - M ) * N
break
print( total )
上述程序虽说可以正确输出结果,但是程序运行的时间随着用户输入的数值变大而变长,下面我们换一种方法,使得程序的运行时间与输入无关。
上面的分析我们已经知道:(当用户刚好输入的是1,3,6,10,15,。。。这些天数)
M = 1 + 2 + 3 + 4 + 5 + ... + N = N * ( N + 1 ) / 2
当N1=1时:M1= N1 * ( N1 + 1 ) / 2 = 1;
当N2=2时:M2= N2 * ( N2 + 1 ) / 2 = 3;
当N3=3时:M3= N3 * ( N3 + 1 ) / 2 = 6;
当N4=4时:M4= N4 * ( N4 + 1 ) / 2 = 10;
当N5=5时:M5= N5 * ( N5 + 1 ) / 2 = 15;
......
考虑到等式:M = N * ( N + 1 ) / 2 即:
N*N + N - 2*M = 0 (1)
解方程得:N= ( sqrt( 1 + 8 * M ) - 1 ) / 2
上面分析我们已经知道总金币数:
total = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + ... + N * N
我们用N1,N2,N3,......,NN表示总金币数:
total = N1*N1 + N2*N2 + N3*N3+ N4*N4 + ... + Nn*Nn
用式1代入得:
total = ( 2 * M1 - N1 ) + ( 2 * M2 - N2 ) + ( 2 * M3 - N3 ) + ... + ( 2 * Mn - Nn )
= 2 * ( M1 + M2 + M3 + ... + Mn ) - ( N1 + N2 + N3 + ... + Nn )
N1 + N2 + N3 + ... + Nn 为数列和:1+2+3+4+...+N = N*(N+1)/2 = Mn
M1 + M2 + M3 + ... + Mn 为数列和:1+3+6+10+15+... +Mn = N*(N+1)*(N+2)/6
所以:total = 2 * ( M1 + M2 + M3 + ... + Mn ) - ( N1 + N2 + N3 + ... + Nn )
= 2 * N * ( N + 1 ) * ( N + 2 ) / 6 - N * ( N + 1 ) / 2
= N * ( N + 1 ) * ( 2 * N + 1 ) / 6
= Mn * ( 2 * N + 1 ) / 3
考虑到用户输入的数值M小于Mn , 修正总数为:
total = Mn * ( 2 * N + 1 ) / 3 - ( Mn - M ) * N
= ( 3 * M * N + Mn - Mn * N ) / 3
最后程序如下:
import math
M = int( input( “请输入一个正整数:” ) )
Nf = ( math.sqrt( 1 + 8 * M ) - 1 ) / 2
N = int( Nf )
if Nf > N:
N = N + 1
Mn = N * ( N + 1 ) / 2
total = ( 3 * M * N + Mn - Mn * N ) / 3
print( total )
相关文章:
金币程序题
昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间…...
《Windows API每日一练》9.13资源-鼠标位图和字符串
鼠标指针位图(Mouse Cursor Bitmap)是用于表示鼠标指针外观的图像。在 Windows 窗口编程中,可以使用自定义的鼠标指针位图来改变鼠标的外观,并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点: ●…...
【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程
一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …...
thinkphp:数据库复合查询-OR的使用
完整代码 $data[info] db::table(po_headers_all)->alias(ph) //设置wip_jobs_all的别名->join([vendors > ve], ph.vendor_codeve.vendor_code)->field(ph.po_num,ph.status,ph.vendor_code,ve.vendor_name,ph.po_all_amount,ph.note,ph.order_date,ph.need_dat…...
网络安全那些梗
网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗: 关掉服务器是最有效的安全方法:这个梗源自一个笑话,讲述了一位程序员因误解妻子的话而只买了一个包子回家,随后被…...
交通气象站:保障道路安全的智慧之眼
随着社会的快速发展,交通运输日益繁忙,道路安全成为公众关注的焦点。在这个背景下,交通气象站作为保障道路安全的重要设施,正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息,也为广大驾驶员…...
【分库】分库的核心原则
目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时,遵循一系列核心原则是至关重要的,以确保系统不仅能够在当前规模下高效运行,还能够随着…...
【Linux】软件管理工具 yum
文章目录 概念搜索:yum list安装:yum install卸载:yum remove 概念 在Linux下安装软件,可以下载到程序的源代码,进行编译得到可执行程序,另外这些软件还有依赖其它工具的问题,还得下载编译这些依…...
LangChain —— Prompt Templates
文章目录 一、什么是 Prompt Templates1、String PromptTemplates2、ChatPromptTemplates3、MessagesPlaceholder 留言占位符 二、如何使用 Prompt Templates1、使用几个简短示例2、在 chat model 中使用几个简短示例3、部分格式化提示模板4、一起编写提示 一、什么是 Prompt T…...
Python库 - Scrapy
Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据ÿ…...
函数(实参以及形参)
实际参数(实参) 实际参数就是在调用函数时传递给函数的具体值。这些值可以是常量、变量、表达式或更复杂的数据结构。实参的值在函数被调用时传递给对应的形参,然后函数内部就可以使用这些值来执行相应的操作。 int main() {int a 0;int b …...
ArcGIS Pro SDK (八)地理数据库 8 拓扑
ArcGIS Pro SDK (八)地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK (八)地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境:Visual …...
uniapp如何发送websocket请求
方法1: onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket连接已打开!);uni.sendSocketMessage({d…...
RabbitMQ的工作模式
RabbitMQ的工作模式 Hello World 模式 #mermaid-svg-sbc2QNYZFRQYbEib {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sbc2QNYZFRQYbEib .error-icon{fill:#552222;}#mermaid-svg-sbc2QNYZFRQYbEib .error-text{fi…...
自建搜索引擎-基于美丽云
Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…...
2024辽宁省大学数学建模竞赛试题思路
A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的&am…...
循环结构(一)——for语句【互三互三】
文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…...
【深度学习基础】MacOS PyCharm连接远程服务器
目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同?2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面,本人用的是Macbook Pro, M3 MAX处理器&am…...
微调Qwen2大语言模型加入领域知识
目录 试用Qwen2做推理安装LLaMA-Factory使用自有数据集微调Qwen2验证微调效果 试用Qwen2做推理 参考:https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…...
【Linux】内核文件系统系统调用流程摸索
内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的: 我们打印的pid,tgid就是从这里来的,然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息: 从上述日志,其实我也把write的系统调用加了入口的打印信…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
