NOIP學習之一維陣列 30 約瑟夫問題

2021-10-02 21:19:35 字數 1474 閱讀 1965

測試鏈結

總時間限制: 1000ms 記憶體限制: 65536kb

描述

約瑟夫問題:有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入n,m後,輸出最後猴王的編號。

輸入

每行是用空格分開的兩個整數,第乙個是 n, 第二個是 m ( 0 < m,n <=300)。最後一行是:

0 0輸出

對於每行輸入資料(最後一行除外),輸出資料也是一行,即最後猴王的編號

樣例輸入

6 212 4

8 30 0

樣例輸出51

7方法一:首尾相連法

約瑟夫問題可以將陣列連成乙個首尾相連的環,也即a[1]=2,a[2]=3…a[n]=1,這樣問題就簡化為將出列的陣列的值賦給前乙個陣列,讓前乙個陣列指向被出列陣列的下乙個陣列,也就是先斷環再連環,這樣最後的陣列元素就是要求的值。

#include

using

namespace std;

int a[

301]

;int

main()

cout<}return0;

}

方法二.遞迴

遞推公式:f(n,m)=(f(n−1,m)+m)%n

實際上是求最後乙個猴子編號在當前取的約瑟夫環所在位置,每次編號都隨著取出的編號而發生變化,直到最後乙個出現位置為0時就是所取的編號值。取模是要當m>n時,也就是取得資料多餘剩餘猴子時,要相當於折返取編號值,也就是對n取模。

#include

inthouwang

(int n,

int m)

;int

main()

return0;

}int

houwang

(int n,

int m)

方法3:

鍊錶

#include

#include

using

namespace std;

intsearch

(char*,

char);

struct node

;node *head,

*p,*r;

int m,n;

intmain()

r->next=head;

head=r-

>next;

//起始位置是鍊錶的最後乙個結點

for(i=

1;i<=n;i++

) cout<>num<}return0;

}

NOIP學習之一維陣列 32 陶陶摘蘋果

測試鏈結 總時間限制 1000ms 記憶體限制 65536kb 描述 陶陶家的院子裡有一棵蘋果樹,每到秋天樹上就會結出10個蘋果。蘋果成熟的時候,陶陶就會跑去摘蘋果。陶陶有個30厘公尺高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。現在已知10個蘋果到地面的高度,以及陶陶把手伸直的時...

NOIP學習之一維陣列 149 大整數加法

測試鏈結 總時間限制 1000ms 記憶體限制 65536kb 描述 求兩個不超過200位的非負整數的和。輸入 有兩行,每行是乙個不超過200位的非負整數,可能有多餘的前導0。輸出 一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。樣例輸入 2222222...

NOIP學習之一維陣列 151 有趣的跳躍

測試鏈結 總時間限制 1000ms 記憶體限制 65536kb 描述 乙個長度為n n 0 的序列中存在 有趣的跳躍 當前僅當相鄰元素的差的絕對值經過排序後正好是從1到 n 1 例如,1 4 2 3存在 有趣的跳躍 因為差的絕對值分別為3,2,1。當然,任何只包含單個元素的序列一定存在 有趣的跳躍 ...