n只猴子围成一圈,从编号为1的猴子开始报数,数到m的猴子出圈,下一只猴子从1重新开始报数,数到m的猴子出圈,如此往复最后剩下一只猴子时,这只猴子就是猴王。依次输出出圈的猴子的编号。
一行,两个整数n,m。
对于100%的数据:
1 \le n,m \le 10^3。
一行,由单个空格分隔的n个整数,表示出圈顺序。
8 5
5 2 8 7 1 4 6 3
list(双向链表):
//1、链表初始化:
list<int> lst; //空链表
list<int> lst(10); //有10个元素
list<int> lst(10,5); //有10个元素,均为5
//2、插入元素
lst.push_front(1); //在前面插入1
lst.push_back(9); //在后面插入9
lst.insert(it,6); //在it位置插入6
//3、删除元素
/*特别注意下面的erase()函数,它删除迭代器指向的元素之后,将会有一个返回值,该返回值指向的是下一个元素,标准的写法是it=lst.erase(it)。若使用lst.erase(it)而不修改it,则当前it指向的元素被删除之后,it指向的位置变为无效,下一次使用it就会发生错误,导致程序崩溃。*/
lst.erase(it); //删除it指向的元素
lst.pop_front(); //删除首元素
lst.pop_back(); //删除尾元素
lst.clear(); //删除全部元素
lst.remove(8); //删除全部为8的元素
//4、查找元素
it=lst.find(4); //查找为4的元素,返回值为lst.end()说明未找到
it=lst.find(lst.begin(),lst.end(),4); //在指定的迭代器之间查找为4的元素
//5、大小
sz=lst.size(); //链表里有多少个元素
//6、排序
lst.sort(); //升序排序
//7、迭代器
it只可以++或--即向后移动或向前移动
//8、合并
lst.merge(lst1); //将list1合并到lst中。
合并时会进行比较元素,如果保存的类型不是基本数据类型(int ,string等)而是自定义类型,则需对自定义类型实现重载的小于比较运算符,如结构体:
struct Node {
int s, d; //起点位置、终点位置
bool operator <(const Node& b) {
return s < b.s;
}
};