问题描述
有 n 个孩子在玩游戏,第一次以开头的人作为领导,第 i 次往下数 ai 个人,最后那个人出局,由这个人的下一个人当领导,直到 k 轮结束。要求出每轮比赛出局的孩子。
解题思路
看到此题,是给孩子们排队计数的类型,我们可以用C++的STL库中的双端队列deque来实现,一开始把 n 个孩子的编号全部入队列,然后每次先取模,即使得每次计数不超过队列长度,再循环 ai 个孩子,每次往后数的操作就是把队头塞到队尾去。这里双端队列中有个很好的东西,push_ back() 和pop_ front()即向队尾插入元素,和弹出(删除)队头元素,与本题题意恰好贴合。
最后输出最后一个孩子并将它出局。
算法描述
#include<bits/stdc++.h>
using namespace std;
deque<int> s; // 双端队列s用于存储数据
int n, k;
int main()
{
cin >> n >> k; // 输入孩子总数n和游戏轮数k
for (int i = 1; i <= n; ++i)
{
s.push_back(i);
} // 将数字从1到n依次插入双端队列s的尾部,构建初始队列
for (int i = 0; i < k; ++i)
{
int ai;
cin >> ai; // 从标准输入读取一个整数ai,表示游戏计数旋转的次数
ai %= s.size(); // 将ai取模s.size(),确保旋转次数不超过队列的长度
while (ai--) // 执行ai次旋转操作
{
s.push_back(s.front()); // 将队列s的队首元素插入队尾
s.pop_front(); // 弹出队首元素
}
int val = s.front(); // 获取旋转前队首的元素
s.pop_front(); // 弹出队首元素
cout << val << " "; // 输出旋转前队首的元素
}
return 0;
}
力扣提交结果
分析、讨论与总结
用stl中的vector也可以实现相同的功能
debug了很久发现就存在一个很小的错误......还是要细心一点,要有耐心一点。