BerSoft公司收入增长分析

问题描述

Petya是Berland公司BerSoft的公关经理,他需要制作一份关于公司自2001年以来收入增长的报告。在报告中,Petya想展示一个"完美"的线性增长模式,即每年收入比前一年增长1个亿。例如,2001年收入为1亿,2002年为2亿,以此类推。

但由于真实收入数据与完美模式有所差异,Petya决定忽略一些数据,保留一个收入增长符合完美模式的最长子序列。具体要求如下:

  • 给定一个包含公司各年收入的序列,Petya需要选择一个最长的子序列,使得该子序列的收入序列为:1, 2, 3, 4, ...,即收入逐年增加1亿。
  • 如果这样的子序列存在,输出其长度及对应的年份;否则输出0。
输入
  • 第一行:一个整数n (1 ≤ n ≤ 100),表示年份的数量。
  • 第二行:n个整数a1, a2, ..., an (-100 ≤ ai ≤ 100),表示每年公司的收入(单位:亿)。
输出
  • 输出一个整数k,表示最长的完美增长序列的长度。
  • 输出k个整数,表示这些年份对应的收入符合完美增长序列的年份。如果不存在这样的子序列,输出0。
解题思路

我们的问题本质上是从给定的收入序列中找到一个满足条件的最长子序列,使得该子序列的值依次为1、2、3、4......,即收入逐年递增。

为了实现这一点,我们可以采用贪心算法。贪心策略是:从头到尾遍历收入序列,尽量选择最小的符合条件的收入来构建最长的完美增长子序列。

步骤分析

  1. 输入解析:我们首先读取年份数n和每年对应的收入数据。
  2. 贪心选择:从收入序列中查找是否能依次匹配1、2、3......等数值。如果匹配成功,则记录对应年份,并寻找下一个符合条件的收入。
  3. 输出:如果能找到符合条件的子序列,输出其长度及对应的年份;否则输出0。

具体实现

def main():
    # 读取输入
    n = int(input())  # 年份数量
    incomes = list(map(int, input().split()))  # 收入数据
    
    target = 1  # 初始目标值为1
    sequence = []  # 存储符合条件的年份序列
    
    # 遍历收入数据
    for i in range(n):
        if incomes[i] == target:  # 如果当前收入符合目标值
            sequence.append(2000 + i + 1)  # 记录该年(2000 + i + 1)
            target += 1  # 目标值加1,查找下一个符合条件的收入
    
    # 如果找到了符合条件的序列
    if sequence:
        print(len(sequence))  # 输出符合条件的子序列的长度
        print(*sequence)  # 输出符合条件的年份
    else:
        print(0)  # 如果没有符合条件的序列,则输出0

if __name__ == "__main__":
    main()

代码解析

  1. 输入读取

    • 使用input()函数读取年份数n
    • 使用map()split()将收入数据转换为整数列表。
  2. 贪心策略

    • 我们从目标值1开始,逐年查找是否存在对应收入。如果找到了1,则找2,依此类推。
    • 如果当前收入匹配目标值,则将当前年份(即2000 + i + 1)加入结果列表。
  3. 输出

    • 如果找到了符合条件的子序列,我们输出子序列的长度和年份。
    • 如果没有找到符合条件的子序列,则输出0

复杂度分析

  • 时间复杂度 :由于我们只遍历一次收入列表,时间复杂度为O(n),其中n是收入数据的数量。由于n的最大值为100,因此该算法效率足够高。

  • 空间复杂度 :我们只使用了一个列表来存储符合条件的年份,因此空间复杂度为O(n)

示例分析

示例1:

输入

10
-2 1 1 3 2 3 4 -10 -2 5
  • 我们的目标序列是1, 2, 3, 4, 5, ...
  • 在收入序列中,我们可以找到:
    • 1 对应 2002年。
    • 2 对应 2005年。
    • 3 对应 2006年。
    • 4 对应 2007年。
    • 5 对应 2010年。

输出

5
2002 2005 2006 2007 2010
示例2:

输入

3
-1 -2 -3
  • 由于没有正数,无法找到符合条件的增长序列。

输出

0

总结

这道题目通过贪心策略和简单的遍历实现了查找符合完美增长条件的子序列。对于每个输入数据,我们尝试从收入序列中依次匹配目标值,直到没有更多符合条件的收入为止。通过这个方法,我们能够高效地找到最长的符合条件的子序列。

相关推荐
m0_748232398 分钟前
基于OpenCV和Python的人脸识别系统_django
python·opencv·django
dme.34 分钟前
Python爬虫selenium验证-中文识别点选+图片验证码案例
爬虫·python
东方-教育技术博主37 分钟前
wps中zotero插件消失,解决每次都需要重新开问题
python
镰圈量化1 小时前
当电脑上有几个python版本Vscode选择特定版本python
开发语言·vscode·python
宇努力学习1 小时前
如何本地部署seepseek
python·ai·ollama·deepseek
橙狮科技1 小时前
使用 GPTQ 进行 4 位 LLM 量化
人工智能·python·语言模型
开开心心就好2 小时前
娱乐使用,可以生成转账、图片、聊天等对话内容
windows·python·智能手机·软件工程·娱乐·软件需求
愚昧之山绝望之谷开悟之坡2 小时前
ragflow-RAPTOR到底是什么?请通俗的解释!
python
背太阳的牧羊人2 小时前
RAG检索中使用一个 长上下文重排序器(Long Context Reorder) 对检索到的文档进行进一步的处理和排序,优化输出顺序
开发语言·人工智能·python·langchain·rag
007_rbq2 小时前
XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
人工智能·python·游戏·机器学习·unity·github·机器翻译