约瑟夫环及其变体

1.问题描述

q1.已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

q2.已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;原先编号为n的数是第几个出列的。

2.编程实现

q1 solution:

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    int n,m,k;
    cin >>n>>m>>k;
    queue<int> q;
    for(int i=k;i<=n;i++)
        q.push(i);
    for(int i=1;i<k;i++)
        q.push(i);
    while(q.size()>1)
    {
        for(int i=0;i<m-1;i++)
        {
            q.push(q.front());
            q.pop();
        }
        q.pop();
    }
    cout<<q.front()<<endl;
    return 0;
}

q2 solution:

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    int n,m,k;
    int res=0;
    cin >>n>>m>>k;
    queue<int> q;
    for(int i=k;i<=n;i++)
        q.push(i);
    for(int i=1;i<k;i++)
        q.push(i);
    while(q.size()>1)
    {
        for(int i=0;i<m-1;i++)
        {
            q.push(q.front());
            q.pop();//删除第一个元素
        }
        res++;
        if(q.front()==n)
            break;
        else
            q.pop();
    }
    cout<<res<<endl;
    return 0;
}
全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务