标签:define 删除 ret fine 它的 mod stream 约瑟夫 include
题目大意:有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; }
标签:define 删除 ret fine 它的 mod stream 约瑟夫 include
原文地址:https://www.cnblogs.com/caijiaming/p/9459548.html