求大佬这道题的代码和思路

Slime

题目描述

小 Z 正在 van 游戏。

这个世界里有 n 只史莱姆,每只被打掉后会变成两只小史莱姆。

现在他的打法如下:

一开始的队列中有 n 只史莱姆,第 i 只编号为 i,被打死后会变成两只编号相同的小史莱姆,排在队列末尾。

小 Z 一路狂刷了许多只史莱姆后,想知道他撸死的第 m 只史莱姆的编号。

输入格式:

两个整数 n,m。

输出格式:

第 m 只史莱姆的编号。

输入样例 1:

2 3

输出样例 1:

1

样例解释:

撸死第一只(1)2 1 1

撸死第二只(2) 1 1 2 2

撸死第三只(1)1 2 2 1 1

括号里表示死亡的史莱姆编号,横线表示分裂后的史莱姆。

输入样例 2:

见 Slime2.in

输出样例 2:

见 Slime2.ans

T2. slime

数据范围:

对于 60%的数据 n,m<=1e6

对于 100%的数据 n,m<=1e18

c++

1个回答

这是对数据结构中队列的应用,这里因为要进行多次入队和出队、并增加元素,所以采用链队;
重点是史莱姆编号的确定和遗传;
一、如果不考虑保存初始史莱姆队列,思路如下:

1.获得n,m;

2.初始化史莱姆队列,即for循环n次,将{1、2、...、n}依次入队;

3.再一个for循环,循环m次,每次将史莱姆队列队头出一个元素,并把这个元素数据连续入队两次;

4.循环结束后,获取队尾的数据,即第m次出队元素的数据,它就是要求得的数据;

5.输出打印上步得到的数据即可;

二、如果要保存整个刷怪的过程队列,思路如下:

1.获得n、m;
2.先初始化史莱姆队列,同上;

3.for循环m次,每次获取史莱姆队列队头元素的数据,并把这个元素数据连续入队两次;

4.循环结束后,获取队尾的数据,即第m次出队元素的数据,它就是要求得的数据;

5.输出打印上步得到的数据即可。

大致的思路是这样的,若有瑕疵,也请其他大佬批评,优化。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐