faebdc玩扑克

这篇博客讲述了faebdc和zky玩扑克游戏的故事,其中涉及一个数学问题:如何找到导致特定输出序列的原始扑克牌排列。博主分享了通过反推算法在(mathcal{O}(1))时间内解决该问题的方法,并强调在解题时应先模拟再优化,避免浪费时间寻找规律。
摘要由CSDN通过智能技术生成

题目背景
faebdc 和 zky 在玩一个小游戏
题目描述
zky 有 nn 个扑克牌,编号从 11 到 nn,zky 把它排成一个序列,每次把最上方的扑克牌放在牌堆底,然后把下一张扑克牌拿出来输出,最终输出的序列恰好是从 11 到 nn,faebdc 问你原序列是什么,因为 faebdc 神犇早已在 \mathcal O (1)O(1) 的时间得出结果,如果你在 1 s 内答不出来,faebdc 会吃了你。
输入格式
一个整数 n,表示扑克数目。
输出格式
nn 个数,表示扑克序列。
输入输出样例
输入 #1复制
13
输出 #1复制
7 1 12 2 8 3 11 4 9 5 13 6 10
说明/提示
对于 100%100% 的数据,1 \le n \le {10}^61≤n≤10 6


解题思路:题意是给你答案序列,先从牌顶抽出一张并将其放在最下面,并打印输出下一张;我们可以反推,维护一个ans数组,让扑克牌从大到小遍历(不用开数组,更不用维护栈),每次递减的同时,先将n放到牌顶,再将最底部的牌放到牌顶:即
ans.push_back(n–);
ans.push_back(ans[pos++]);
并在n为0的时候退出循环。
打印结果时,从后向前打印,注意 i > ans.size()-1-n

反思:做题时不要轻易推结论找规律,根据题目意思先进行模拟,并优化算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值