約瑟夫問題(vector的使用)
阿新 • • 發佈:2018-08-11
人的 fin div push_back bsp back 下一個 給定 code
題目大意:有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 #defineLson 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; }
約瑟夫問題(vector的使用)