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;
}