Python交叉排序 计蒜客例题

题目:蒜头君很无聊,现在有 NN 个数,其中第 i(1 \leq i \leq N)i(1≤i≤N) 个数是 A_iAi​。

现在他先将 A_{l_1}, A_{l_1+1}...A_{r_1}Al1​​,Al1​+1​...Ar1​​ 从小到大排序。

再将 A_{l_2}, A_{l_2+1}...A_{r_2}Al2​​,Al2​+1​...Ar2​​ 从大到小排序。

请输出 AA 排序后的最终结果。

输入格式

第一行五个整数 N, l_1, r_1, l_2, r_2(l_1 < r_1, l_2 < r_2)N,l1​,r1​,l2​,r2​(l1​<r1​,l2​<r2​),均不超过 100000100000。

第二行 NN 个不超过 int 范围的整数,表示 AA 数组。

输出格式

一行 NN 个用空格分隔的整数,表示 AA 排序以后的结果。

我用的是区间划分思想,最关键的问题就是如何划分区间。

  • python的列表区间是左闭右开的
  • python下标区间和位置区间对应的是减一的关系
s = [int(i) for i in input().split(' ')]
x=[]
N = s[0]
l_1,r_1,l_2,r_2=s[1],s[2],s[3],s[4]
num = [int(n) for n in input().split(' ')]
l = num[l_1-1:r_1]
r = num[l_2-1:r_2]
l.sort()
r.reverse()
for i in range(N):
    if i<l_1-1:
        print(num[i],end=' ')
    elif l_1-1<=i and i<r_1:
        print(l[i-l_1+1],end=' ')
    elif r_1<=i and i<l_2-1:
        print(num[i],end=' ')
    elif l_2-1<=i and i<r_2:
        print(r[i-l_2+1],end=' ')
    else:
        print(num[i],end=' ')

写这个文章主要原因是遇到这题的时候找不到方便我这种小白理解的答案,就自己写了= =

看了男票做的,终于知道基础不牢地动山摇是啥意思了0.0这个题完全可以用内置函数部分排序,代码更简单了!

s = [int(i) for i in input().strip().split()]
N,l_1,r_1,l_2,r_2 = s[0],s[1],s[2],s[3],s[4]

AA = [int(i) for i in input().strip().split()]

AA[l_1-1:r_1]= sorted(AA[l_1-1:r_1])#sorted函数默认升序,要注意list区间从0开始,并且是左闭右开的
AA[l_2-1:r_2]=sorted(AA[l_2-1:r_2],reverse=True)#这个区间是降序,reverse=True

for i in range(len(AA)):
    if i < len(AA)-1:
        print(AA[i],end=' ')
    else:
        print(AA[i])

运行结果:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值