有 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時都會淘汰乙隻猴子,最後剩下的猴子為大王。請問,猴子大王的一開始的序號是多少?首先這道題乍一看似乎如果用陣列做,陣列的下標會比較難處理,但我們可以...