题目大意:输入一个整数k表示好人的数量.然后一个圈有2k个人组成。前k个是好人,后k个是坏人。请确定合适的步数,使得在杀掉第一个好人之前,把所有的坏人都杀掉
解题思路:约瑟夫环问题
代码如下:
/*
* 1443_1.cpp
*
* Created on: 2013年8月11日
* Author: Administrator
*/
#include <iostream>
using namespace std;
//res[]用来存储1~14个好人是应该走的步数
int res[16];
int fun(int n) {
int ans, sum;
sum = n * 2;
if (res[n]) {
return res[n];
} else {
for (ans = n + 1;; ans++) {
//每一个可能的值都需要sum和flag来标记
bool flag = 0;
sum = n * 2;
int j;
for (j = ans;; j += ans - 1) { //人数减1
if (j > sum) {
j = j % sum ? j % sum : sum;
}
if (j <= n) {
break;
} else {
--sum; //人数减1
}
if (sum == n) {
flag = 1;
break;
}
}
if (flag) {
res[n] = ans;
return res[n];
}
}
}
}
int main() {
int k;
while (scanf("%d", &k), k) {
// printf("%d\n",fun(k));
cout << fun(k) << endl;
}
}