C++ Poj3750 小孩報數問題
阿新 • • 發佈:2019-01-07
一、題目:
http://poj.org/problem?id=3750
二、思路:
1.考慮儲存方式:用字元陣列儲存小孩的名字,如name[65][20];
2.解決報到尾時不足S,要回到開頭從0開始報到,用求餘;
3.考慮已經輸出的孩子如何進行處理:是移動陣列,還是標記已經輸出過,兩種方法都可以;
這道題與約瑟夫問題有點不同,輸出第一個小孩名字時,因為此時w = 2,是從Xiaohua開始數,Xiaohua並不出列。而約瑟夫問題呢?Start=4,首先要把第4個人先出列,再去數s步,把第二個人出列,接著把其他人出列。
三、實現程式:AC
#include <iostream> using namespace std; char name[65][20]; // 儲存孩子的名字 int main(int argc, const char * argv[]) { int n, w, s, i, count; // n儲存孩子數, w:從第w個開始報數,s報到第s個 char ch; // 把逗號去掉 cin >> n; // 輸入孩子數 // 迴圈輸入孩子的名字 for(i = 0; i < n; i++) cin >> name[i]; cin >> w >> ch >> s; count = 0; w = w - 2; // 減2是因為第一個比較特殊,下標從0開始減1,其次因為xiaohua沒輸出過,是第一個數 while(count < n) { // 已經出列的人數 for(i = 0; i < s; i++) { w = (w + 1) % n; // 求餘,解決到尾要重新從0開始的問題,形成迴圈 if(name[w][18] == '1') //如果此人已出列,不算 i--; } cout << name[w] << endl; name[w][18] = '1'; //把此人標記為找過 count++; } return 0; }
執行結果: