某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
思路很简单:就是放入一个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\n", *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;
}