题目简述
假设现在有n个人,围成一个从1到n的环。
先顺时针的方向数RRR个人,数到RRR的人出局,将自己手里的牌子给下一个人。然后逆时针数LLL个人,第LLL个人出局,将自己手里的牌子给下一个人(逆时针),然后再顺时针,再逆时针,直到最后剩下max(L,R)−1max(L,R)-1max(L,R)−1个人为止,输入为n R L,输出为最后手里令牌最多的人的序号以及令牌数量。
思考
- 注意顺序是有序的,先顺时针然后再逆时针,方向可以用一个bool变量来控制。
- 本文直接利用数组来做的,因此要注意环,当越界的时候,要将下标置于边界处。
- 出局的时候,需要将自己的令牌转移,此时注意,只是做了转移的操作,并没有将指向自己的指针进行移动,因此
findFirstR或者findFirstL函数的时候,注意传递的参数哪些是引用,哪些是值传递。
代码
需要调试的时候,将DEBUG打开即可。
#include <iostream>
#include <vector>
#define DEBUG 0
using namespace std;
// 用于调试时输出res数组
void printRes(vector<int>& res)
{
cout<<"当前的res是:";
for(int i=0; i<res.size();++i)
{
cout<<res[i]<<" ";
}
cout<<endl;
}
void findFirstR(vector<int>& res, int s,int tmp_value_R)
{
bool finded

这篇博客探讨了一个涉及n个人的环形令牌传递问题,每次按照顺时针和逆时针交替传递,直到剩下max(L,R)-1个人。文章详细解释了算法实现,包括如何处理边界情况和令牌传递,并提供了C++代码示例进行演示。通过双指针和计数器的方法解决出局和令牌转移,最终找出持有令牌最多的人及其数量。
最低0.47元/天 解锁文章
389

被折叠的 条评论
为什么被折叠?



