该用户从未签到
|
地板
发表于 2016-11-01 15:48:08
|只看该作者
若m个人以1到m编号,剩余人数为i;当n<=m时,首先是n至m号的人先出圈;n>i,每轮第n%i个人出圈。* Z7 W/ G; i, z
n>i的情况下:4 T c7 h+ g1 Q7 j
n除以i的商为1时,从n%i对应的序号开始每隔一位的序号出圈(n%i, n%i + 2,...,[末位序号或末位序号-1])
# x7 U$ x* T5 s5 ?, an除以i的商为2时,出圈顺序同上规律...
! t& V2 p$ x" t# L @int i = m;% J; P# T; Z+ o& |7 W8 y
List<Integer> baselist = new ArrayList<>();
/ L, w q f( y6 Gint[] res = new int[m];
4 p0 E' \$ `, ?& z3 C M9 F3 @- W# g% `for(int j = 0;j < m;j++)
* Y$ p2 `# q! R5 G* [ B baselist.add(j+1);
- ^ j+ i! ?7 X( e9 L% i/ ^for(;i >= n;i--){
. W$ D; B, I8 ^5 q' S res[m - i] = m + n - i;/ s# B( k1 `- Y$ Z$ x' r
baselist.remove((Integer)(m + n - i));
! V! {0 Z3 ~1 c}
* b0 `# f$ A7 G2 owhile(i > 0){; d) a/ M3 f5 i2 L+ _0 C5 G4 d
for(int j = n%i==0? i-1: n%i -1;j < baselist.size();j++){) \; i7 h2 ~$ \4 H+ {
res[m - i--] = baselist.get(j);$ V, ]5 A8 s- j+ h
baselist.remove(j); e F6 e/ s% s6 c$ |$ O
}. `9 M5 h7 [ j$ B3 W1 J
}! H+ u4 }0 A9 h& z; ^. t& v% D
数组res为所求8 @0 d# S7 U8 K! x' _" h7 Z9 ?9 _2 F
|
|