HDU 1276 士兵佇列訓練問題

2021-10-01 05:59:51 字數 1116 閱讀 5629

某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。

本題有多個測試資料組,第一行為組數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 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行一至二報數 一至三報數...