某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
思路很简单:就是放入一个vector容器里面,while循环,满足条件的就删除。做题过程中很容易被删除弄出bug,因为动态数组大小随时在变,所以无法很自然的删除。
因此,这种删除最为方便快捷。所以以后要注意指针的改变!!!!
int main(){ vector<int> a; a.push_back(3); a.push_back(2); a.push_back(3); a.push_back(3); a.push_back(5); vector<int>::iterator b; int x = 3; for(b=a.begin();b!=a.end();) { if(*b==x){ b=a.erase(b); }else{ b++; } } for(b=a.begin();b!=a.end();b++) { printf("value=%d ", *b); } return 0; } 同时附上题目代码 #include<iostream> #include<string> #include<set> #include<vector> #include<stack> using namespace std; int main() { int n; cin>>n; while(n--) { int m; vector<int > vec; cin>>m; for(int i=1;i<=m;i++) vec.push_back(i); vector<int>::iterator it; while(vec.size()>3) { int flag=1; for(it=vec.begin();it!=vec.end();) {if(flag%2==0) it=vec.erase(it); else it++; flag++;} if(vec.size()<=3) break; flag=1; for(it=vec.begin();it!=vec.end();) {if(flag%3==0) it=vec.erase(it); else it++; flag++;} } int flag=1; for(it=vec.begin();it!=vec.end();it++) { if(flag==1) cout<<*it; else cout<<" "<<*it; flag++; } cout<<endl; } return 0; }