報數

報數

題目描述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將報的數字保存下來。

相關文章
相關標籤/搜索