题目1188:约瑟夫环
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1200
解决:533
-
题目描述:
-
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
-
输入:
-
包括一个整数N(1<=N<=3000)及一个整数p。
-
输出:
-
测试数据可能有多组,对于每一组数据,
按退出顺序输出每个退出人的原序号。
-
样例输入:
-
7 3
-
样例输出:
-
3 6 2 7 5 1 4
-
-
#include<iterator> #include<cstdio> #include<list> using namespace std; int main() { bool f; int n,p,i,d; list<int> v; list<int>::iterator pos; while(~scanf("%d%d",&n,&p)) { for(i=1;i<=n;++i) v.push_back(i); for( i=p,pos=v.begin(),f=true; n>0; n=v.size(),i=p ) { d=distance(pos,v.end()); while(i>n) i-=n ; if(d>=i) advance(pos,i-1); else { pos=v.begin(); advance(pos,i-d-1); } if(f){ printf("%d",*pos); f=false; } else printf(" %d",*pos); pos=v.erase(pos); } printf("\n"); } return 0; } /************************************************************** Problem: 1188 User: 3011216016 Language: C++ Result: Accepted Time:120 ms Memory:1024 kb ****************************************************************/