zoukankan      html  css  js  c++  java
  • 牛客网编程练习(2018校招真题编程题汇总)------疯狂队列

    时间限制:1秒 空间限制:32768K

    题目描述

    小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。

    输入描述:

    输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数
    第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高

    输出描述:

    输出一个整数,表示n个学生列队可以获得的最大的疯狂值。
    
    如样例所示: 
    当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。
    这是最大的疯狂值了。
    示例1

    输入

    5
    5 10 25 40 25

    输出

    100

    Python Code:

    参考https://blog.csdn.net/qq_34617032/article/details/78578982 的代码

    n = int(input())
    heights = [each_height for each_height in map(int, input().split())]
    
    s2l = sorted(heights)  # 从小到大排
    l2s = s2l[::-1]  # 从大到小排
    
    results = []
    pop_small = True
    left = True
    for i in range(n):
        if i == 0:
            results.append(s2l.pop())  # 把最大的元素放进来
        elif i == n - 1:
            if pop_small:
                temp = l2s.pop()
                if abs(results[0] - temp) > abs(results[n - 2] - temp):
                    results.insert(0, temp)
                else:
                    results.append(temp)
            else:
                temp = s2l.pop()
                if abs(results[0] - temp) > abs(results[n - 2] - temp):
                    results.insert(0, temp)
                else:
                    results.append(temp)
        elif pop_small:
            if left:
                results.insert(0, l2s.pop())
                left = False
            else:
                results.append(l2s.pop())
                left = True
                pop_small = False
        else:
            if left:
                results.insert(0, s2l.pop())
                left = False
            else:
                results.append(s2l.pop())
                left = True
                pop_small = True
    
    print(sum([abs(results[i] - results[i + 1]) for i in range(n - 1)]))

    解题思路:把原序列排序,先取出最大的数放在results中,然后在最大数的两边放两个最小的数,接着在两个最小的数两边放第二、第三大的数
      依次类推,再放入最后一个数的时候要注意,计算它放在最左侧或最右侧时与相邻的元素差值的绝对值,选择把它放在绝对值大的那一侧

  • 相关阅读:
    如何让一个图片宽度为百分比时居中,且宽度等于高度
    React创建组件的三种方式及其区别
    给电脑换源 npm 国内镜像 cnpm
    ps使用图层合并切图
    textarea去掉右下三角号
    使用定时器通过改变图片的src来切换图片
    如何使一个元素垂直居中
    如何让背景图固定,不随着滚动条移动而且在不同分辨率的屏幕下铺满
    java 中MAP的按照进入顺序遍历与无序遍历
    java树形目录展示
  • 原文地址:https://www.cnblogs.com/xiaotongtt/p/10720237.html
Copyright © 2011-2022 走看看