这个是约瑟夫环类问题,在大多数数学思维的书上都有关于这类问题的介绍,看Description就应该知道题目怎么个意思,但已开始接手这个问题是有一点懵的,会觉得很麻烦,不知道如何处理出局的那只猴子,以及怎样标记每个猴子的序号,其实用数组就可以解决啦:
先看一下代码吧:
#include<stdio.h>
int main()
{
int i, j, k, change;
int monkey[1001]={0};
int m,n;
while(scanf("%d %d",&m, &n)==2)
{
for (i = 0; i < m; i++)
monkey[i] = i + 1;
for (i = m - 1; i >= 0; i--)
for (k = 1; k <= n; k++)
{
change = monkey[0];
for (j = 0; j < i; j++)
monkey[j] = monkey[j + 1];
monkey[i] = change;
}
printf("%d\n", monkey[0]);
}
return 0;
}
先将每个猴子的编号从1道m排好,之后进入三重循环,先记录第一个猴子的编号,一个个淘汰猴子,将猴子一一往后排,最后一个赋为monkey【0】,最后剩下的一个就是monkey【0】。因为循环数较多所以时间效率较低,这个在OJ上提交TLE83%,我们先从这个代码来理解题目意思哈。
下面是AC代码:
#include <stdio.h>
int main()
{
int m,n,i;
while(scanf("%d %d",&m, &n)==2)
{
int king=0;
for (i=2 ; i<=m ; i++)
king = (king+n)%i;
printf("%d\n",king+1);
}
return 0;
}
有一丝难理解,详细见这篇博文。