排队唱歌
题目描述
我们部门要排队唱歌,大家乱哄哄的挤在一起,现在需要按从低到高的顺序拍成一列,
但每次只能交换相邻的两位,请问最少要交换多少次
输入描述:
第一行是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的升序顺序。