当前位置: 首页 > article >正文

单调栈--- 分奖金

题目描述
公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。

按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得“距离 * 数字差值”的奖金。如果遇不到比自己数字大的,就给自己分配随机数数量的奖金。

例如,按照工号顺序的随机数字是:2,10,3。那么第2个员工的数字10比第1个员工的数字2大,所以,第1个员工可以获得 1 *(10-2)= 8 。第2个员工后面没有比他数字更大的员工,所以,他获得他分配的随机数数量的奖金,就是10。第3个员工是最后一个员工,后面也没有比他更大数字的员工,所以他得到的奖金是3。

请帮老板计算一下每位员工最终分到的奖金都是多少钱。

输入描述
第一行n表示员工数量(包含最后一个老板)

第二是每位员工分配的随机数字

输出描述
最终每位员工分到的奖金数量

注:随机数字不重复,员工数量(包含老板)范围110000,随机数范围1100000

用例1
输入
3
2 10 3
输出
8 10 3

#如果暴力的话,数量级有点大,可能会超时
#利用单调栈来解决
n=int(input())
money = list(map(int,input().split()))

def  getresult():
    #记录money[i]的下一个更大的元素的索引
    nextBiggerIndex = [-1]*n
    #单调递减栈,栈中记录money数组的索引,索引对应的元素单调递减
    stack=[]
    for i in range(n):
        while stack and money[i]>money[stack[-1]]:
            #找一下栈顶元素索引对应元素的下一个更大元素的索引位置
            nextBiggerIndex[stack.pop()] = i

        stack.append(i)

    results = []
    for i in range(n):
        j = nextBiggerIndex[i]
        if j==-1:
            results.append(money[i])
        else:
            results.append((j-i)*(money[j]-money[i]))
    return ' '.join(map(str,results))
print(getresult())

http://www.kler.cn/a/379270.html

相关文章:

  • Lucene分析器的详细使用(5)
  • 鸿蒙进阶-AlphabetIndexer组件
  • leetcode71:简化路径
  • 你丢失的数据,10款数据恢复软件帮你找!!
  • 流畅!HTMLCSS打造网格方块加载动画
  • Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作
  • 开源呼叫中心系统 FreeIPCC:WebRTC 详解
  • 贪心算法习题其二【力扣】【算法学习day.18】
  • dns服务部署 作业
  • Docker:网络 Network
  • 探索Python编程:从入门到实践的全面指南
  • 海康威视监控rtsp播放
  • ubantu lnmp
  • 【Android】Activity组件通信
  • 002-Kotlin界面开发之Kotlin旋风之旅
  • Jmeter5.X性能测试
  • 【机器学习】 16. 降维:PCA-主成分分析 Principle Component Analysis
  • Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问
  • Docker配置国内源加速
  • chrome 安装vuejs
  • CocoaPods安装步骤详解 - 2024
  • 封装ES高亮Yxh-Es
  • auxm 注册多个router参数时报错
  • Python数据分析NumPy和pandas(二十、数据清洗和预处理之二:数据转换)
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)
  • SpringBoot核心知识点