小孩报数问题
Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 10309
Accepted: 4783
Description
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
Input
第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔
Output
按人名输出小孩按顺序出列的顺序,每行输出一个人名
Sample Input
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3
Sample Output
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi
Source
题目大意:题意很明确,就是约瑟夫环。不过从第W个位置开始计数1,数S个
位置,然后出环,输出。
思路:用STL里边的string存放小孩的名字。用list双向链表模拟约瑟夫环。
注意:
string里边clear();用来清除所有字符。
list里push_back(i);用来将编号i放入list
begin();指向第一个元素的位置
end();指向最后一个元素后边的位置
list<int>::iterator it;迭代器用来指向报数编号。
find(first,last,value);用来在区间[first,last)之间找到值等于value的位置
erase(it);用来删除迭代器it指向的元素
*it 表示迭代器it指向的元素值
#include<iostream> #include<algorithm> #include<string> #include<list> using namespace std; string child[100]; list<int> v; int main() { int N,W,S; while(cin >> N) { v.clear(); for(int i = 1; i <= N; ++i) child[i].clear(); char c; for(int i = 1; i <= N; ++i) cin >> child[i]; cin >> W >> c >> S; for(int i = 1; i <= N; ++i) v.push_back(i); list<int>::iterator it; it = find(v.begin(),v.end(),W); while(v.size() > 0) { for(int i = 1; i < S; i++) { ++it; if(it == v.end()) it = v.begin(); } cout << child[*it] << endl; it = v.erase(it); if(it == v.end()) it == v.begin(); } } return 0; }
时间: 2024-10-21 23:11:40