山东科技大学OJ猴子选大王//约瑟夫环

 这个是约瑟夫环类问题,在大多数数学思维的书上都有关于这类问题的介绍,看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;
}

有一丝难理解,详细见这篇博文

猜你喜欢

转载自blog.csdn.net/weixin_43820496/article/details/85087873