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
这是对数据结构中队列的应用,这里因为要进行多次入队和出队、并增加元素,所以采用链队;
重点是史莱姆编号的确定和遗传;
一、如果不考虑保存初始史莱姆队列,思路如下:
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.输出打印上步得到的数据即可。
大致的思路是这样的,若有瑕疵,也请其他大佬批评,优化。