约瑟环,完全没想起来 = =!
先写一下思路吧,虽然我也不知道这思路是怎么想到的,总是这样就扔给你一个思路,然后去理解 = =
举例来讲,比如 1 2 3 4 5 6 ,start 代表好人的起始位置,end代表坏人的起始位置,start =0; end = 3; m = 5; kill代表死掉的人的位置
第一轮后 剩下 6 1 2 3 4 ,kill = 4, start = 1,end = 4
第二轮后 剩下 6 1 2 3 ,kill = 4, start = 1, end = 0;
第三轮后 剩下 1 2 3, kill = 1, start = 0
kill = (m-1)%n, start = ((start-m)%n+n)%n end = ((end-m)%n+n)%n;
n 代表现存的人数
看着代码敲了一遍,感觉理解还是不很深刻 = =
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <string.h> 6 using namespace std; 7 8 bool joseph(int k, int m) 9 { 10 int start = 0; 11 int end = k - 1; 12 int kill; 13 for(int n=2*k; n>k; n--) 14 { 15 kill=(m-1)%n; 16 if(kill >= start && kill <= end) 17 return false; 18 start = ((start-m)%n+n)%n; 19 end = ((end-m)%n+n)%n; 20 } 21 return true; 22 } 23 24 int main () 25 { 26 int k; 27 int f[14]; 28 for(int i=0; i< 14; i++) 29 { 30 for(int j=1; ;j++) 31 { 32 if(joseph(i, j)) 33 { 34 f[i]=j; 35 break; 36 } 37 } 38 } 39 while(~scanf("%d",&k)&&k) 40 { 41 printf("%d\n",f[k]); 42 } 43 return 0; 44 }