约瑟夫问题(vector的使用)

题目大意:有n个人围坐在圆桌周围,每个人都有一个固定的编号。 从第s(<=n)个人开始报数(按照顺时针方向,从1开始),报到m的人出列,接着再从出列着的

下一个人开始报数(依然从1开始),报到m的人又出列······重复进行,直到所有人都出列。给定任意的n,s.m和刚开始n个人的编号,求他们出列的顺序

看代码

#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
const int maxn=1e3+10;
const int maxk=5e3+10;
const int maxx=1e4+10;
const ll maxe=1000+10;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
vector<int>v1,v2;//v1代表初始状态,v2存答案
int n,a,s,m;
void solve()
{
    vector<int>::iterator it=v1.begin();
    for(int i=1;i<s;i++)//这里为何是从1开始呢?  因为本身已经算一个了
    {
        it++;
        if(it==v1.end()) it=v1.begin();//注意当it到达末尾时,指向第一个元素
    }
    while(!v1.empty())
    {
        for(int i=1;i<m;i++)
        {
            it++;
            if(it==v1.end()) it=v1.begin();
        }
        v2.push_back(*it);
        v1.erase(it);//删除它并且指向它的下一个元素
        if(it==v1.end()) it=v1.begin();//当删除的是最后一个元素时,指向第一个元素
    }
}
int main()
{


    cin>>n>>s>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a;
        v1.push_back(a);//
    }

    solve();
    vector<int>::iterator it1;
    it1=v2.begin();
    for(it1;it1!=v2.end();it1++) cout<<*it1<<" ";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/caijiaming/p/9459548.html