- 题目描述:
-
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
- 输入:
-
包括一个整数N(1<=N<=3000)及一个整数p。
- 输出:
-
测试数据可能有多组,对于每一组数据,
按退出顺序输出每个退出人的原序号。
- 样例输入:
-
7 3
- 样例输出:
-
3 6 2 7 5 1 4
模拟一下即可,利用next数组模拟环形,节省时间1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 int ans[3002]; 7 int next[3002]; 8 9 int main(int argc, char const *argv[]) 10 { 11 int n, p; 12 while(scanf("%d %d",&n,&p) != EOF) { 13 for(int i = 0; i < 3002; i++) { 14 next[i] = i+1; 15 } 16 next[n-1] = 0; 17 18 int t = 0; 19 int current = n-1; 20 int lasc = n-2; 21 int bao = -1; 22 do { 23 lasc = current; 24 current = next[current]; 25 bao = (bao+1) % p; 26 if(bao == p-1) { 27 ans[t++] = current+1; 28 next[lasc] = next[current]; 29 } 30 31 } while(t < n) ; 32 33 printf("%d",ans[0]); 34 for(int i = 1; i < n; i++) { 35 printf(" %d",ans[i]); 36 } 37 puts(""); 38 } 39 return 0; 40 }