每日一题2023/1/16

文章讨论了一道编程竞赛题目,关于构建特定规则的数列。给定一个自然数n,从n开始,每次可以在数列末尾添加不超过当前最后一项一半的自然数,求所有可能的合法数列。解决方案涉及递归算法和记忆化搜索,以避免超时错误。

[NOIP2001 普及组] 数的计算

题目描述

给出自然数 nnn,要求按如下方式构造数列:

  1. 只有一个数字 nnn 的数列是一个合法的数列。
  2. 在一个合法的数列的末尾加入一个自然数,但是这个自然数不能超过该数列最后一项的一半,可以得到一个新的合法数列。

请你求出,一共有多少个合法的数列。两个合法数列 a,ba, ba,b 不同当且仅当两数列长度不同或存在一个正整数 i≤∣a∣i \leq |a|ia,使得 ai≠bia_i \neq b_iai=bi

输入格式

输入只有一行一个整数,表示 nnn

输出格式

输出一行一个整数,表示合法的数列个数。

样例 #1

样例输入 #1

6

样例输出 #1

6

提示

样例 1 解释

满足条件的数列为:

  • 666
  • 6,16, 16,1
  • 6,26, 26,2
  • 6,36, 36,3
  • 6,2,16, 2, 16,2,1
  • 6,3,16, 3, 16,3,1

数据规模与约定

对于全部的测试点,保证 1≤n≤1031 \leq n \leq 10^31n103

说明

本题数据来源是 NOIP 2001 普及组第一题,但是原题的题面描述和数据不符,故对题面进行了修改,使之符合数据。原题面如下,谨供参考:

我们要求找出具有下列性质数的个数(包含输入的正整数 nnn)。

先输入一个正整数 nnnn≤1000n \le 1000n1000),然后对此正整数按照如下方法进行处理:

  1. 不作任何处理;
  2. 在它的左边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半;
  3. 加上数后,继续按此规则进行处理,直到不能再加正整数为止。

解决思路

这同样是一个递归算法的题(最近都会练习递归),一般思路从寻找递归关系式和终止条件入手
根据样例来看,6本身不做处理算一种,6后面可以加的数是1 ~ 6/2也就是1 ~ 3,然后分别再思考61,62,63后面又能加的数,这里递归的就不是某个f(n),而是一个范围,也就是1 ~ n/2,所以进递归的应该是自增变量i,也就是f(i),为了计算答案,我们需要一个全局变量ans用来做每一次调用f(i)的自增,因为进函数一次就说明后面跟了一个数,这本身就算是一种答案。所以有了以下的递归函数:

long long ans = 0;
void f(int n)
{
	ans++;
	for (int i = 1; i <= n / 2; i++)
		f(i);
}

但是这么做的话,会有一个超时的问题,也就是当n=1000的时候会TLE。
为了解决TLE的问题,这里就用到了“DFS记忆化搜索”的方法,在n很大的时候,会经常出现已经遇到过的f(i),我们开辟一个数组,就把已经计算过的i记忆下来,下次遇到的时候就直接跳过,这里重点不在DFS,重点掌握递归函数

int a[1001] = { 0 };
void f(int n)
{
	if (a[n] != 0) return;  //已经求过了的n就跳过
	a[n] = 1;  //6本身也算一种方法
	for (int i = 1; i <= n / 2; i++)
	{
		f(i);
		a[n] = a[n] + a[i];  //把每种情况累加起来
	}
}
<think>我们正在寻找包含数据文件的Python3大题或练习题。这意味着题目需要涉及读取外部数据文件(如文本文件、CSV文件等),并进行数据处理、分析或计算。根据之前引用的内容,虽然未直接提供这类题目,但我们可以结合引用[1]中提到的解题思路(如处理数字、开方等)和引用[3]中强调的函数练习题,创建一道使用数据文件的大题。题目设计思路:1.题目要求读取一个包含多个数字的数据文件(如每行一个数字),然后对这些数字进行处理。2.可以结合完全平方数的概念(如引用[1]中的问题)或其它计算要求。3.强调函数的定义和使用(如引用[3]中提到的函数练习)。示例题目:题目:假设有一个数据文件`numbers.txt`,其中包含若干正整数(每行一个)。编写一个程序,读取该文件,然后计算并输出以下内容:1.文件中的每个数字是否是完美平方数?(输出是或否)2.统计文件中完美平方数的个数。3.将所有的完美平方数写入另一个文件`squares.txt`中。要求:-定义函数判断一个数是否为完美平方数。-定义函数处理文件读取和写入。注意:完美平方数指的是可以表示为某个整数平方的数,例如1、4、9、16等。我们将提供`numbers.txt`的示例内容(供测试):100121144200250预期输出:100是完美平方数。121是完美平方数。144是完美平方数。200不是完美平方数。250不是完美平方数。完美平方数的总数为:3同时,在`squares.txt`文件中写入:100121144这是一个典型的包含数据文件处理的练习题,同时考察了函数定义、文件操作、数学运算。如果需要更多类似题目,我们可以继续设计,比如处理CSV文件(包含学生成绩,计算平均分等),或者文本文件(统计词频)等。参考引用中提到了函数练习的重要性[^3],我们可以通过这类题目来加强函数的使用。如果用户需要,我们也可以提供这道题的完整代码示例。相关问题:1.如何设计一个从CSV文件中读取数据并处理分析的Python练习题?2.有没有关于使用JSON或XML数据文件的Python练习题?3.能否设计一个包含数据文件读取和绘图的Python大题?根据用户需求,我们可以调整题目的难度和内容。</think> 以下是基于您需求设计的包含数据文件处理的Python 3大题练习示例,结合文件操作、数据处理和函数应用: ### 题目1:CSV数据分析 ```python """ 给定 sales_data.csv 文件内容: date,product,quantity,price 2023-01-01,A,15,29.9 2023-01-01,B,8,15.5 2023-01-02,A,20,29.9 2023-01-02,C,12,45.0 要求: 1. 读取CSV文件并计算每日总销售额 2. 找出销售额最高的产品 3. 将结果写入report.txt文件 """ import csv def analyze_sales(file_path): # 在此实现你的代码 pass # 测试 analyze_sales('sales_data.csv') ``` ### 题目2:文本文件处理 ```python """ 给定 log.txt 文件内容: ERROR: File not found INFO: Process started WARNING: Low memory INFO: Process completed ERROR: Connection timeout 要求: 1. 统计各类日志级别的出现次数 2. 提取所有ERROR级别的日志内容 3. 生成JSON格式的统计报告 """ import json def process_logs(file_path): # 在此实现你的代码 pass # 测试 process_logs('log.txt') ``` ### 题目3:数据清洗与转换 ```python """ 给定 students.json 文件内容: [ {"id": 101, "name": "Alice", "math": 85, "english": null}, {"id": 102, "name": "Bob", "math": 92, "english": 78}, {"id": 103, "name": "Charlie", "math": null, "english": 88} ] 要求: 1. 过滤掉包含空值的数据 2. 计算学生总分并添加排名 3. 转换为CSV格式输出 """ import json import csv def clean_student_data(file_path): # 在此实现你的代码 pass # 测试 clean_student_data('students.json') ``` ### 推荐资源 1. [Python数据科学题库](https://github.com/rougier/numpy-100) - 包含NumPy数据文件处理的100道练习 2. [Pandas数据处理练习](https://github.com/guipsamora/pandas_exercises) - 使用真实数据集的Pandas练习题 3. [Kaggle数据集](https://www.kaggle.com/datasets) - 获取免费的真实数据集用于练习 这些题目涵盖了: - CSV/JSON/文本文件处理 - 数据清洗与转换 - 基本统计分析 - 多文件格式相互转换 - 结果输出到文件 函数封装和文件操作是数据处理的核心能力,通过这些练习可以掌握实际工作中的数据处理流程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RefrainC.C.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值