1762 牛的洗牌(递推)

1. 问题描述:

农夫约翰坚信快乐的奶牛会产出更多的牛奶,因此他在谷仓中安装了一个巨大的迪斯科球,并计划教他的奶牛跳舞!在查阅了一些牛的流行舞蹈后,约翰决定教他的奶牛"洗牌舞"。洗牌舞是由他的 N 只奶牛按一定顺序排成一行,然后连续执行三次"洗牌",每次"洗牌"都可能会使奶牛重新排序。为了让奶牛们更容易找到自己所处的位置,约翰用数字 1∼N 对一行中奶牛所在的位置进行了标记,一行中第一头奶牛处于位置 1,第二头奶牛处于位置 2,以此类推,直到位置 N。每次"洗牌"用 N 个数字 a1,a2,…,aN 来描述,处于位置 i 的奶牛在一次"洗牌"过后,需要移动至位置 ai(因此,每个 ai 在 1…N 范围内)。幸运的是,所有 ai 都是互不相同的,因此,不会存在多头奶牛在洗牌结束后移动到同一个位置的情况。约翰的每头奶牛都有一个属于自己的唯一 7 位整数 ID (不含前导 0)。给定你三轮"洗牌"过后的奶牛排列顺序,请你求出奶牛们的初始排列顺序。

输入格式

第一行包含整数 N。第二行包含 N 个整数,表示 a1,a2,…,aN。第三行包含了 N 头奶牛三轮“洗牌”过后的排列顺序,每头奶牛都用其 ID 指代。

输出格式

共 N 行,按照 N 头奶牛的初始排列顺序,每行输出一头奶牛的 ID。

数据范围

1 ≤ N ≤ 100,
1 ≤ ai ≤ N

输入样例:

5
1 3 4 5 2
1234567 2222222 3333333 4444444 5555555

输出样例:

1234567
5555555
2222222
3333333
4444444
来源:https://www.acwing.com/problem/content/1764/

2. 思路分析:

首先需要读懂题目的意思,a1,a2...aN表示当前第i个元素放到位置a[i]上,每一个元素都有其唯一的id编号,我们已知的是经过三次"洗牌"操作也即将第i个元素放到位置a[i]上的最终结果,需要求解出一开始的元素顺序使得经过三次"洗牌"操作之后能够得到当前的最终结果,理解题目之后就比较好办了,我们根据最终的结果进行逆推即可,上一次的洗牌的结果为idx[i] = idx[a[i]],其中idx为牛当前的编号。

3. 代码如下:

class Solution:
    def process(self):
        n = int(input())
        # a的前面补一个0这样下标可以从1开始会比较方便
        a = [0] + list(map(int, input().split()))
        idx = [0] + list(map(int, input().split()))
        for i in range(3):
            # pre存储中间结果
            pre = [0] * (n + 10)
            for j in range(1, n + 1):
                pre[j] = idx[a[j]]
            # 将得到的中间结果赋值给idx
            for j in range(1, n + 1):
                idx[j] = pre[j]
        for i in range(1, n + 1):
            print(idx[i])


if __name__ == '__main__':
    Solution().process()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值