Description
某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。Input
本題有多個測試數據組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。Output
共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。Sample Input
2 20 40Sample Output
1 7 19 1 19 37 題解:本來題目是用鏈表的方法,本人愚鈍,不會用,看了別人的博客才明白,在最後展示 我采用模擬的方法,即直接按照題意寫出。 要注意最後輸出的格式! 下面這個代碼是錯誤的。很久才找到錯誤所在。只是一個小小的錯誤(最下面有AC的代碼)#include<iostream> using namespace std; int main() { int i,t,n,p; int f=0; int a[5100]; cin>>t; while(t--) { int q;//定義整型變量,n賦值給q cin>>n; q=n; for(i=1; i<=n; i++) a[i]=i; while(q>3) //判斷條件 { p=0; for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==2) { a[i]=0; f+=1; //統計出列士兵個數 p=0; } } q=q-f; if(q<=3)break; p=0; f=0; //注意每次歸0 for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==3) { a[i]=0; f+=1; p=0; } } q=q-f; } p=0; for(int i=1; i<=n; i++) { if(a[i]==0) continue; else { p+=1; if(p==q) cout<<a[i]<<endl; else cout<<a[i]<<" "; } } } return 0; }
這個才是正確的,錯誤的地方有標記
#include<iostream> using namespace std; int main() { int i,t,n,p; int a[5100]; cin>>t; while(t--) { int q;//定義整型變量,n賦值給q cin>>n; q=n; for(i=1; i<=n; i++) a[i]=i; while(q>3) //判斷條件 { int f=0;//這裡!! p=0; for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==2) { a[i]=0; f+=1; //統計出列士兵個數 p=0; } } q=q-f; if(q<=3)break; p=0; f=0; //注意每次歸0 for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==3) { a[i]=0; f+=1; p=0; } } q=q-f; } p=0; for(int i=1; i<=n; i++) { if(a[i]==0) continue; else { p+=1; if(p==q) cout<<a[i]<<endl; else cout<<a[i]<<" "; } } } return 0; }
參考小雲博客:鏈表使用,與模擬還是很相像的
#include"iostream" #include"list" using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; list<int> s; if(n==0) cout<<0<<endl; else { for(int i=1; i<=n; i++) s.push_back(i); list<int>::iterator it,ip;//鏈表遍歷迭代器 int f=1; int flag=s.size(); while(flag>3) { for(it=s.begin(); it!=s.end();) { if(f==2) { f=1; ip=it; it++; s.erase(ip); //抹除操作 flag--; } else { f++; it++; } } f=1; if(flag<=3) break; for(it=s.begin(); it!=s.end();) { if(f==3) { f=1; ip=it; it++; s.erase(ip); flag--; } else { f++; it++; } } f=1; if(flag<=3) break; } int w=0; for(it=s.begin(); it!=s.end(); it++) { cout<<(*it); //注意輸出格式 w++; if(w<=flag-1) cout<<' '; } cout<<endl; } } return 0; }