不敢死隊問題
oblem description
到「敢死隊」,大家不要以為我來介紹電影了,因為資料結構裡真有這麼道程式設計題目,原題如下:
有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從下乙個戰士開始數數,被數到第5時,此戰士接著去執行任務。以此類推,直到任務完成為止。
這題本來就叫「敢死隊」。「誰都不想去」,就這一句我覺得這個問題也只能叫「不敢死隊問題」。今天大家就要完成這道不敢死隊問題。我們假設排長是1號,按照上面介紹,從1號開始數,數到5的那名戰士去執行任務,那麼排長是第幾個去執行任務的?
input
輸入包括多組資料,每組一行,包含乙個整數m(0<=m<=10000)(敢死隊人數),若m==0,輸入結束,不做處理。
output
輸出乙個整數n,代表排長是第n個去執行任務。
sample input96
2230
sample output26
132解題的主要思路是構建鏈環,其實也可以用
int f(int n,int m)
return n==1?n:(f(n-1,m)+m-1)%n+1;
在本題中m 的值為5;
不好意思,我好像寫錯了,這個是返回最後所存值的編號,那就在這裡記錄一下吧!!
#include
using
namespace std;
struct node
;int
main()
tail-
>next=head-
>next;
num=0;
m=0;
tail=head;
p=tail-
>next;
while
(numelse
}printf
("%d\n"
,num);}
return0;
}
下面再說一下雙向鍊錶的做法
#include
#include
struct node
;int
main()
tail->next=head->next;
head->next->up=tail;
int d=
0,c=0;
q=head->next;
free
(head)
;while(1
)else
q=q->next;
}printf
("%d\n"
,c);
}return0;
}
sdut 不敢死隊問題
有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從...
鍊錶 不敢死隊
description 有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如...
SDUT OJ 不敢死隊問題 鍊錶
time limit 1000ms memory limit 65536k 有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對...