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

总结

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

相关推荐
东方佑8 分钟前
深度解析Python-PPTX库:逐层解析PPT内容与实战技巧
开发语言·python·powerpoint
Python大数据分析@17 分钟前
python 常用的6个爬虫第三方库
爬虫·python·php
一顿操作猛如虎,啥也不是!25 分钟前
JAVA-Spring Boot多线程
开发语言·python
斯内科36 分钟前
Python入门(7):Python序列结构-字典
python·字典·dictionary
云徒川36 分钟前
【设计模式】过滤器模式
windows·python·设计模式
橘猫云计算机设计1 小时前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
互联网杂货铺1 小时前
如何用Postman实现自动化测试?
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
予安灵2 小时前
一文详细讲解Python(详细版一篇学会Python基础和网络安全)
开发语言·python
冷月半明2 小时前
Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
python·selenium
冷月半明2 小时前
《Pandas 性能优化:向量化操作 vs. Swifter 加速,谁才是大数据处理的救星?》
python·数据分析·pandas