排队唱歌

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

输入描述:
第一行是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的升序顺序。

 
posted @ 2020-07-28 15:11  Andy_George  阅读(116)  评论(0编辑  收藏  举报