码迷,mamicode.com
首页 > 其他好文 > 详细

排队唱歌

时间:2020-07-28 17:27:21      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:变量   二分   range   return   pen   参考   多少   for   顺序   

题目描述
我们部门要排队唱歌,大家乱哄哄的挤在一起,现在需要按从低到高的顺序拍成一列,
但每次只能交换相邻的两位,请问最少要交换多少次

输入描述:
第一行是N(N<50000),表示有N个人
然后每一行是人的身高Hi(Hi<2000000,不要怀疑,我们以微米计数),持续N行,表示现在排列的队伍
输出描述:
输出一个数,代表交换次数。
示例1
输入
6
3
1
2
5
6
4
输出
4

 

参考:

思路:二分查找

import bisect  #二分查找
def func(lst, n):
    s = [lst[0]]
    res = 0
    for i in range(1, n):
        j = bisect.bisect(s, lst[i])
        bisect.insort(s, lst[i])
        res += (i-j)
    return res

if __name__ == __main__:
    n = int(input())
    lst = []
    for i in range(n):
        lst.append(int(input()))
    res = func(lst, n)
    print(res)

 注:

i = bisect.bisect(s, val) 在有序序列s中,查找val应当插入到序列s的哪一个位置,返回索引值。 

bisect.insort(s, item)把变量item插入到序列s中,并保持s的升序顺序。

 

排队唱歌

标签:变量   二分   range   return   pen   参考   多少   for   顺序   

原文地址:https://www.cnblogs.com/ai-learning-blogs/p/13391248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!