int mind01()
{
vector<int> vec;
int n, m;
scanf("%d%d",&n,&m);
//初始化
for (int i=1;i<=n;i++)
{
vec.push_back(i);
}
//开始游戏
int vz = 0;
while (vec.size() > 1) //留下最后一个人
{
//约瑟夫环经典公式-->循环队列
vz = (vz + m - 1) % vec.size(); //因为下表从0开始的,所以减一
//淘汰的那个人
cout << vec[vz] << endl;
vec.erase(vec.begin()+vz);
}
//淘汰掉最后一个人
cout << vec[0] << endl;
return 0;
}
int mind02()
{
queue<int> que;
int n, m;
int count_num = 1; //计数
scanf("%d%d",&n,&m);
//初始化
for (int i=1;i<=n;i++)
{
que.push(i);
}
//开始游戏-->循环队列
while (!que.empty()) //当队列不为空
{
if (count_num == m) //有人要被淘汰掉了
{
cout << que.front() <<" ";
que.pop(); //把被淘汰的人从队列中剔除出去
count_num = 1; //下一个人要重新从1开始
}
else //这个人不会被淘汰掉
{
count_num++;
que.push(que.front()); //把队头的人当到队尾
que.pop();
}
}
return 0;
}
struct node
{
int date;
node *next;
}*head , *tail; //循环链表的头尾结点
void initList(int len)
{
//辅助指针
node* s;
//建立头节点
head = new node;
tail = head;
head->next = NULL;
//初始化-->尾插法
for (int i=1;i<=len;i++)
{
s = new node;
s->date = i;
tail->next = s;
tail = s;
}
tail->next = head->next; //循环链表
}
void del_node(node * &cur,node * &pro)
{
node *s = cur;
pro->next = cur->next;
cur = cur->next;
delete s;
s = NULL;
}
int mind03()
{
int n, m;
int count_num = 1; //计数
node *cur = NULL;
node *pro = NULL;
scanf("%d%d",&n,&m);
initList(n);
cur = head->next;
cur = head->next;
pro = head;
这里我们不妨先把头节点删掉
while (pro->next != pro) //只剩下最后一个人了
{
//cout << "aaaa" << endl;
if (count_num == m) //踢人咯
{
count_num = 1;
cout << cur->date << " ";
del_node(cur,pro);
}
else
{
count_num++;
cur = cur->next;
pro = pro->next;
}
}
//
if (pro != NULL)
{
//cout << "aaaa" << endl;
cout << pro->date << endl;
delete pro;
pro = NULL;
cur = NULL;
}
if (head != NULL)
delete head;
return 0;
}
//线段树-->可以直接百度查找模板直接使用即可 O(lbn)
/*
线段树是一种二叉搜索树,与区间树相似,
它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。
对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],
右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。
使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。
而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩。
线段树至少支持下列操作:
Insert(t,x):将包含在区间 int 的元素 x 插入到树t中;
Delete(t,x):从线段树 t 中删除元素 x;
Search(t,x):返回一个指向树 t 中元素 x 的指针。
*/