某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
本題有多個測試資料組,第一行為組數n,接著為n行新兵人數,新兵人數不超過5000。
共有n行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有乙個空格。220
401 7 19
1 19 37
訓練時候做的題,感覺自己的方法有些偏,所以想分享下自己的思路。首先我感覺一般看到這道題肯定是想到要用乙個陣列去充當佇列,然後去模擬,但是問題的關鍵是選出來的人怎麼處理,在這裡我思考了很久,最後想的辦法是:首先我們可以發現,不管怎麼報數,佇列都是順序排列的,那我讓報到的位置變成0,然後我再用sort排序,這樣除了前面被選出來的一堆0,後面的佇列就是我們要的,所以這道題也就解決了,然後自己的缺陷是 最後處理輸出格式的時候沒啥好辦法,就用了列舉(好在也只有三種可能:剩下1或2或3個人)。
#includeusing namespace std;
int main()
sort(s,s+k);
p+=o;
}else
sort(s,s+k);
p+=o;
}z++;
} int c=0;
if(k==1)
printf("1"); /*當k<3時s[k-3]不存在,會出現錯誤結果*/
else if(k==2)
printf("1 2");
else
if(c==1) printf("%d",s[k-1]);
else if(c==2) printf("%d %d",s[k-2],s[k-1]);
else if(c==3) printf("%d %d %d",s[k-3],s[k-2],s[k-1]); /*為了保證結尾沒有多餘空格*/
else continue;
} printf("\n");
}return 0;
}
HDU1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
HDU 1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
HDU1276 士兵佇列訓練問題
hdu 1276 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行一至二報數 一至三報數...