猴子大王 鍊錶

2021-10-09 11:05:44 字數 2082 閱讀 9711

有 n 只猴子圍成一圈,編號為 1~n,打算從中選出乙個大王。經過協商,決定選大王的規則如下:從第一只猴子開始迴圈報數,數到 k 的猴子出圈,然後從下乙隻猴子繼續報數出圈……最後剩下來的那只猴子就是大王。

一行兩個正整數 n 和 k,之間用乙個空格分開,2≤n≤1000,2≤k≤10^9 。

6

4

一行 n 個正整數,表示 n 只猴子依次出圈的編號,中間用乙個空格隔開

421

365

1.由於到末尾需要從頭開始,所以將資料存入成環的鍊錶中

2.數數直到k,記錄此時的p以及它的前乙個結點pre,將p剔除環,並釋放記憶體

#include

#include

using namespace std;

typedef

struct node

node;

intmain()

ptail->next=head;

p=head;

while

(n2>0)

(n2==1)

?printf

("%d\n"

,p->data)

:printf

("%d "

,p->data)

; n2--

; pre->next=p->next;

//剔除結點p

free

(p);

p=pre->next;}}

return0;

}

將 n 個人排成一排,編號 1~n。從第 1 人開始進行 1~m 正向報數,報到 m 的人出列,再從下乙個人開始繼續1~m 報數、出列。(注意:按某個方向報數報到尾部時,再反方向繼續報數)。如此進行下去,直到剩下一人為止,輸出最後乙個人的編號。

一行兩個正整數 n 和 m,2≤n,m≤300,m≤n,兩個數之間用乙個空格分隔。

9

3

一行乙個正整數,表示小明在佇列中的編號。

8
(1)由於需要正向、反向查數,所以需要雙向鍊錶,d=1/d=2控制正向、反向

(2)刪除結點時,如果刪除了頭節點,需要重新設定頭節點head=p->next;如果刪除了尾結點,需要重新設定尾節點ptail=p->pre;直至剩下頭尾兩個結點。

(3)當知剩下頭尾兩個結點時,根據p的指向和d的值會產生4種情況,刪除乙個後,head->data為答案。

注意:雙向鍊錶中每個節點都需要考慮當前p的前乙個pre的指向、後乙個next的指向

#include

#include

using namespace std;

typedef

struct node

node;

intmain()

ptail=q;

//設定尾結點

p=head;

d=1;

num=0;

while

(head!=ptail)

//直到剩下頭尾兩個節點

if(p==head)

//該刪頭,改變頭結點的位置

p->pre->next=p->next;

//刪除其他節點

p->next->pre=p->pre;

if(d==1)

p=p->next;

else p=p->pre;

continue;}

if(d==1)

//只剩下頭尾兩個節點時

else

p=p->next;

}else

else

p=p->pre;}}

printf

("%d\n"

,head->data)

;return0;

}

鍊錶 PTA 猴子選大王

一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。每只猴子預先設定乙個數 或稱定數 用最後乙隻猴子的定數d,從第一只猴子開始報數,報到d的猴子即退出圈子 當某只猴子退出時,就用它的定數決定它後面的第幾隻猴子將在下次退出。如此不斷迴圈,最後剩下的乙隻猴子就選...

鍊錶經典問題 猴子選大王

n 只猴子要選大王,選舉方法如下 所有猴子按1,2 n 編號並按照順序圍成一圈,從第 1個猴子起,由 1開始報數,報到 m時,該猴子就跳出圈外,下乙隻猴子再次由 1開始報數,如此迴圈,直到圈內剩下乙隻猴子時,這只猴子就是大王。include includeusing namespace std ty...

猴子選大王(陣列 鍊錶實現)

已知,有n只猴子,圍繞成一圈,從第1只猴子開始報數1,第2只猴子報數2,以此類推,報數到m時,該猴子退出圈外。從下乙隻猴子開始,重新開始報數,每次報數到m時都會淘汰乙隻猴子,最後剩下的猴子為大王。請問,猴子大王的一開始的序號是多少?首先這道題乍一看似乎如果用陣列做,陣列的下標會比較難處理,但我們可以...