1. 程式人生 > >山東科技大學OJ猴子選大王//約瑟夫環

山東科技大學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;
}

有一絲難理解,詳細見這篇博文