题解:Counting-out Rhyme

Counting-out Rhyme - 洛谷

问题描述

有 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了很久发现就存在一个很小的错误......还是要细心一点,要有耐心一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值