一个,两个,蓝精灵 (10 分)(Python)

在广袤安宁的原始森林中,快乐的蓝精灵们正在准备一年一度的蓝月亮节。而就在这欢喜忙碌的关头,他们的宿敌——邪恶的巫师格格巫和他的宠物阿兹猫闯入了蓝精灵的秘密领地。受到惊吓的蓝精灵四散而逃,其中可怜的笨笨则盲打误撞跑进了一个神秘的山洞,山洞中的守护神告诉笨笨它喜欢排好队的小朋友,换句话说蓝精灵们只要按照从矮到高排好队就可以从山洞中通过。

现在村庄里一共有n个蓝精灵,他们的身高为1~n的整数,不存在身高相同的蓝精灵。 你可以每次任意交换队伍中的蓝精灵位置,使他们的顺序变为严格升序。请你编写程序计算最少需要交换几次才能让蓝精灵们通过山洞,躲避格格巫的追捕?

输入格式:
第一行:一个正整数n(n<1000),表示蓝精灵的数量

第二行:n个正整数,用空格分开,表示目前蓝精灵的排列情况,每一个正整数表示该位置蓝精灵的身高。

输出格式:
输出一个正整数,表示至少交换多少次,才能帮助蓝精灵们通过山洞。

输入样例:
5
3 1 2 5 4

输出样例:
3
样例说明:
交换1号蓝精灵和2号蓝精灵使队伍变成1 3 2 5 4

交换2号蓝精灵和3号蓝精灵使队伍变成1 2 3 5 4

交换4号蓝精灵和5号蓝精灵使队伍变成1 2 3 4 5

交换方法不唯一,但可以得出该交换次数是最少的

常规做法:

n=int(input())
lst=list(map(int,input().split()))
count=[i for i in range(1,n+1)]
naa=0
for i in range(n):
    if lst[i]!=i+1:
        for j in range(n):
            if lst[j]==i+1:
                lst[i],lst[j]=lst[j],lst[i]
                naa+=1
    if lst==count:
        break
print(naa)

结合算法思想的做法:

n = eval(input())
l = list(map(int, input().split()))
sum = 0
for i in range(n):
    for j in range(i + 1, n):
        if l[i] > l[j] == min(l[i + 1:]):
            l[i], l[j] = l[j], l[i]
            sum += 1

print(sum)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值