1 条题解
-
0
✅ 解题策略
我们从 开始逐一尝试,对于每一个 ,模拟一个大小为 的环,每次杀一个人,记录前 个被杀的编号:
只要其中有一个编号 (也就是好人),那么这个 不满足
否则,说明前 轮中杀死的都是坏人,可以输出这个最小的
代码实现
#include <stdio.h> int main() { //freopen ("a.txt" , "r" , stdin ) ; int people[50] = {0}, k, Joseph[14] = {0};//Joseph用于打表,不然超时 while(scanf("%d", &k) != EOF && k != 0) { if (Joseph[k] != 0) { printf("%d\n", Joseph[k]); continue; } int n = 2 * k; int m = 1; people[0] = 0;//people[0] = 0表示编号从0开始 for (int i = 1; i <= k; i++) { //每次枚举完毕将剩下的人按从0到n - i编号,只要好人没有杀掉,则前面k - 1个编号是不变的 people[i] = (people[i - 1] + m - 1) % (n - i + 1); // printf ("[%d] = %d , " , i , people[i] ) ; if (people[i] < k)//第k个人的编号为k - 1,所以这里是<而不是<= { i = 0 ; m++; } } // printf ("\n") ; Joseph[k] = m; printf("%d\n", m); } return 0; }
- 1
信息
- ID
- 13
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者