題目描述ios
有n個小朋友作遊戲,他們的編號分別是1,2,3...n。他們按照編號從小到大依次圍成一個圓圈,從第一個小朋友開始從1報數,依次按照順時針方向報數(加一),報m的人會離開隊伍,而後下一個小朋友會繼續從1開始報數,直到只剩一個小朋友爲止。spa
輸入格式code
第一行輸入兩個整數,n,m。(1≤n,m≤1000)blog
輸出格式隊列
輸出最後一個小朋友的編號,佔一行。遊戲
樣例輸入ci
10 5
樣例輸出io
3
解法class
一道較爲經典的隊列題。stream
首先要明白這題爲何能夠用隊列來作,「圍成一個圓圈」其實就能夠想象成一個相似的隊列。須要一個while循環,每次循環先把隊首小朋友報的數字保存下來,再把隊首的小朋友踢出去,而後檢查小朋友報的數字和m是否相同。若是相同,那麼就把小朋友再請回來;反之,踢出去就踢出去好了。那爲何要先踢出去呢?由於小朋友們圍成的是一個圓圈,而隊列只是一個受限制的線性結構。從隊首踢出,再回到隊尾,就模擬了一個圓圈。
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 int main () 5 { 6 queue<int> q; 7 int n,m; 8 cin>>n>>m; 9 for(int i=1;i<=n;i++) 10 { 11 q.push(i); 12 } 13 int t=1; 14 while(q.size()>1) 15 { 16 int now=q.front(); 17 q.pop(); 18 if(t!=m) 19 { 20 q.push(now); 21 } 22 else 23 { 24 t=0; 25 } 26 t++; 27 } 28 cout<<q.front()<<endl; 29 return 0; 30 }
第13行的t是用來存儲小朋友要報的數字,並且每當有小朋友報數=m時,t就要從1從新開始。那你可能會發現,第24行給t賦的值是0,這是由於在這個if判斷以後,26行有一個t++的操做~
第16行的now是用來存儲隊首小朋友報的數字的,由於若是把隊首小朋友踢出去了,再想獲取他報的數字就很困難,因此咱們就先用變量now將報的數字保存下來。