hdu 1276 士兵队列训练问题 (详解)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1276 士兵队列训练问题 (详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,并排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以后從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input
本題有多個測試數據組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output
共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
思路
頻繁的刪除操作,鏈表可以
代碼
#include<bits/stdc++.h> using namespace std; int n,m; //n:組數 m:人數 k:要報的數(2或3) int main() {scanf("%d",&m); //組數 for (int i=1;i<=m;i++){scanf("%d",&n);//每組的新兵人數int k=2;list <int> l; //建立鏈表,如果在外面建的話,每次處理完數據都要清空鏈表 list <int>::iterator it; //iterator為迭代器,it用作鏈表的下標(應該是這么理解的,第一次打鏈表,啥也不是) for (int j=1;j<=n;j++) l.push_back(j); //建立新兵的編號 while (l.size()>3) //人數在3人以上就要報數出隊 {int cnt=0; //當前所報的數 for (it=l.begin();it!=l.end();) //it從鏈表的頭開始,直到鏈表的尾 {cnt++; //開始報數 if (cnt%k==0) //需要出隊了it=l.erase(it); //新兵出隊,it要繼承出隊新兵的數據,這樣每次跑鏈表的時候才不會“跑丟” else it++; //注意這里,為什么不直接在for循環里it++呢?如果這樣的話鏈表就失去它不連續空間的意義了,會“跑丟”(個人理解,我也不知道這樣理解對不對) }if (k==2) k=3; else k=2;//更改下次要報的數 } for (it=l.begin();it!=l.end();it++) {if (it!=l.begin()) cout<<" ";cout<<*it; } cout<<endl; }return 0; }總結
以上是生活随笔為你收集整理的hdu 1276 士兵队列训练问题 (详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicat的连接配置
- 下一篇: 栈的简单实现及应用