山東科技大學OJ猴子選大王//約瑟夫環
阿新 • • 發佈:2019-01-14
這個是約瑟夫環類問題,在大多數數學思維的書上都有關於這類問題的介紹,看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; }
有一絲難理解,詳細見這篇博文。