士兵佇列訓練問題
南昌理工學院ACM集訓室
某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,并排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數,,,,以后從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止,
題意是開始的時候逢2出列,比如20個數就是:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;(開始報數)
1,3,5,7,9,11,13,15,17,19;***(2的倍數全出去了,繼續做while回圈,直到size<=3為止)***
>從佇列頭開始就可以用k=q.front()這個函式,之后用push(k)(把他拿出來,然后簡單了如果是1,2報數那就q.pop(),q.pop();兩下就好了,
1,3,7,9,13,15,19;同理,1,2,3報數那就k=q.front(),然后q.push(k);后q.pop()掉第一個然后再k=q.front();再k=q.front();再q.pop(); q.pop()兩下;
1,7,13,19;
1,7,19;***(到這里就可以退出回圈了)***
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int t,n;
cin>>t;//輸入回圈次數
while(t--) {
queue<int>q;//定義佇列
cin>>n;//輸入總人數
if(n==1) {
cout<<'1'<<endl;
continue;
}//當人數為1的時候直接輸出就好了,一開始我就是這里沒有注意到,一直WA,問的學長才知道
for(i=1; i<=n; ++i) {
q.push(i);
}
int p=1,x,k;
while(q.size()>3) {
x=q.size();//人數
if(p%2!=0) {//偶數
for(i=0; i<x/2; ++i) {
k=q.front();//1,3,5,7...19
q.push(k);//拿出
q.pop();
q.pop();//洗掉前兩個
}
if(x%2!=0) {
k=q.front();
q.push(k);
q.pop();
}
} else {//奇數
for(i=0; i<x/3; ++i) {
k=q.front();
q.push(k); //1
q.pop();//洗掉拿出的數
k=q.front();
q.push(k);//2
q.pop();//洗掉拿出的數
q.pop();//洗掉不需要的數
}
while(x%3!=0) {
--x;
k=q.front();
q.push(k);
q.pop();
}
}
++p;
}
if(q.size()==3)//之后按著格式輸出就好了,注意最后一次輸出不要空格
{
cout<<q.front()<<' ';
q.pop();
cout<<q.front()<<' ';
q.pop();
cout<<q.front()<<'\n';
q.pop();
}
if(q.size()==2)
{
cout<<q.front()<<' ';
q.pop();
cout<<q.front()<<'\n';
q.pop();
}
if(q.size()==2)
{
cout<<q.front()<<'\n';
q.pop();
}
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/249942.html
標籤:其他
上一篇:MFC雙人五子棋
下一篇:撰寫一個函式,輸入n為偶數時,呼叫函式求1/2+1/4+…+1/n,當輸入n為奇數時,呼叫函式求1/1+1/3+…+1/n
