该用户从未签到
|
地板
发表于 2016-11-01 15:48:08
|只看该作者
若m个人以1到m编号,剩余人数为i;当n<=m时,首先是n至m号的人先出圈;n>i,每轮第n%i个人出圈。
" q1 M, e! A0 S; {, _" dn>i的情况下:9 n) U. A: U! c9 m' y$ w& c) C
n除以i的商为1时,从n%i对应的序号开始每隔一位的序号出圈(n%i, n%i + 2,...,[末位序号或末位序号-1])
1 s3 k, U% D$ H6 R. @- Bn除以i的商为2时,出圈顺序同上规律...
8 t2 j5 T$ e& Nint i = m;+ m* p2 _' b7 i$ s. t
List<Integer> baselist = new ArrayList<>();( i" }, ~, X, l) s
int[] res = new int[m];- z, @# o5 t: x+ g1 @# K7 h
for(int j = 0;j < m;j++)* s+ H$ l) f6 v. P
baselist.add(j+1);
' ~2 S2 G, k# n9 Ofor(;i >= n;i--){
9 Q% R& S6 i6 i- D res[m - i] = m + n - i;
7 q# U9 n3 A. n baselist.remove((Integer)(m + n - i));
) d1 i2 n1 u# L6 p8 E}
$ k8 n, n! H2 x) i% cwhile(i > 0){
^' B5 R# c; ~3 j$ ?/ n" n$ E for(int j = n%i==0? i-1: n%i -1;j < baselist.size();j++){; g) `( m( H, t+ C2 M7 h5 c# S
res[m - i--] = baselist.get(j);" B- P2 m' H% M a
baselist.remove(j);
# O9 U k$ m& a f" ~1 t2 J }
7 h A' R1 J/ S7 J9 m2 e0 k}
( a' o% g, F- V4 L* v) Q数组res为所求/ P! u7 `% x- G- W8 J* ?% F; p2 N
|
|