大体题意:
有n 个人,进行比赛,第一轮比赛 从1开始报数,报到1的出局,第二轮报2,,,, 问最后谁没出局?
思路:
一看就是约瑟夫环问题的变型了。
在简单记录一下思考的过程吧:
n 个人 编号为0,1,2,,,,,n-1.
假设这一局k-1 出局了。
那么重新编号:
k k+1 k+2,,,, n-1 0 1 k-2
0 1 2 n-2
这n -2 个人进行比赛。
那么我们给他变回去即可!
怎么变呢? 显然是(x + k) % n = f[n]
但是这里k 是变化的,当i 为2 时 只有两个人 显然报数是 n-i+1.
详细见代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int f[5007];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
f[1] = 0;
for (int i = 2; i <= n; ++i){
f[i] = (f[i-1] + n-i+1) % i;
}
printf("%d\n",f[n]+1);
}
return 0;
}
King's Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 703 Accepted Submission(s): 390
Problem Description
In order to remember history, King plans to play losephus problem in the parade gap.He calls
n(1≤n≤5000)
soldiers, counterclockwise in a circle, in label
1,2,3...n
.
The first round, the first person with label 1 counts off, and the man who report number 1 is out.
The second round, the next person of the person who is out in the last round counts off, and the man who report number 2 is out.
The third round, the next person of the person who is out in the last round counts off, and the person who report number 3 is out.
The N - 1 round, the next person of the person who is out in the last round counts off, and the person who report number n−1 is out.
And the last man is survivor. Do you know the label of the survivor?
The first round, the first person with label 1 counts off, and the man who report number 1 is out.
The second round, the next person of the person who is out in the last round counts off, and the man who report number 2 is out.
The third round, the next person of the person who is out in the last round counts off, and the person who report number 3 is out.
The N - 1 round, the next person of the person who is out in the last round counts off, and the person who report number n−1 is out.
And the last man is survivor. Do you know the label of the survivor?
Input
The first line contains a number
T(0<T≤5000)
, the number of the testcases.
For each test case, there are only one line, containing one integer n , representing the number of players.
For each test case, there are only one line, containing one integer n , representing the number of players.
Output
Output exactly
T
lines. For each test case, print the label of the survivor.
Sample Input
2 2 3
Sample Output
2 2 Hint: For test case #1:the man who report number $1$ is the man with label $1$, so the man with label $2$ is survivor. For test case #1:the man who report number $1$ is the man with label $1$, so the man with label 1 is out. Again the the man with label 2 counts $1$, the man with label $3$ counts $2$, so the man who report number $2$ is the man with label $3$. At last the man with label $2$ is survivor.
Source
Recommend